我已经开始使用 Guice 对项目进行一些依赖注入,主要是因为我需要在远离单元测试的一层注入 mocks(目前使用 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 和模拟框架的能力)或者是否有更好的解决方案可以手动完成。