当一个类实现一个接口时,我们所要做的就是模拟该接口。
但是在某些情况下,当一个类没有实现一个接口时,在这种情况下,将类绑定到一个模拟引导guice来获取模拟的对象依赖项。
澄清:
class A {
@Inject B;
}
class B{
@Inject C;
}
bind(a.class).toInstance(mock(B.class));
在这种情况下,我不关心B的依赖关系,但是guice仍在尝试在B中注入C.
有没有办法在不定义界面的情况下避免这种情况?
答案 0 :(得分:1)
首先,我强烈建议不要在单元测试中使用依赖注入。当您对单个类进行单元测试时,您应该创建它并通过构造函数或方法直接传递其依赖项。那时你不会遇到这些问题。
当你编写集成测试时,这是另一个故事。您的问题有几种解决方案。
确保所有类仅通过可注入的构造函数接收依赖项。这样Guice不会注入任何东西,因为该对象将由Mockito创建。
使用提供程序(如果需要,还可以使用范围)。以下相当于您尝试注入B(我假设您的确意味着bind(B.class).toInstance(mock(B.class))
:
bind(B.class).toProvider(new Provider<B> {
@Override
public B get() {
return mock(B.class);
}
}).in(Singleton.class);
您应该调整范围以满足您的需求。
答案 1 :(得分:0)
使用Mockito来解决这个问题非常容易。
您需要使用@Mock
和@InjectMocks
这样的注释
ATest{
@Mock B;
@InjectMocks A;
public void setUp(){
MockitoAnnotations.initMocks(this);
}
}
这样Mockito会执行注入而不是guice,有几个restrictions可以成功注入模拟。
这很有效,直到你的代码对一个类有很强的依赖性。
让我们说内部A我有类似C obj = new C();和C注入了字段。