プロジェクトで依存性注入を行うために Guice を使い始めました。主な理由は、単体テストから離れたレイヤーに (現在 JMock を使用して) モックを注入する必要があるためです。これにより、手動注入が非常に厄介になります。
私の質問は、モックを導入するための最良のアプローチは何ですか? 私が現在持っているのは、依存関係を満たす単体テストで新しいモジュールを作成し、次のようなプロバイダーにバインドすることです。
public class JMockProvider<T> implements Provider<T> {
private T mock;
public JMockProvider(T mock) {
this.mock = mock;
}
public T get() {
return mock;
}
}
コンストラクターでモックを渡すため、JMock のセットアップは次のようになります。
final CommunicationQueue queue = context.mock(CommunicationQueue.class);
final TransactionRollBack trans = context.mock(TransactionRollBack.class);
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(CommunicationQueue.class).toProvider(new JMockProvider<QuickBooksCommunicationQueue>(queue));
bind(TransactionRollBack.class).toProvider(new JMockProvider<TransactionRollBack>(trans));
}
});
context.checking(new Expectations() {{
oneOf(queue).retrieve(with(any(int.class)));
will(returnValue(null));
never(trans);
}});
injector.getInstance(RunResponse.class).processResponseImpl(-1);
より良い方法はありますか?AtUnit がこの問題に対処しようとしていることは知っていますが、上記のようにローカルで作成されたモックを自動的に魔法のように注入する方法がわかりませんが、ここで AtUnit が正しい答えである説得力のある理由 (その他) を探しています。テストを変更せずにDIとモックフレームワークを変更する能力よりも)、または手動で行うためのより良い解決策があるかどうか。