当类实现接口时,我们要做的就是模拟该接口。
但是,在某些情况下,类别不实现接口,在这种情况下,将类绑定到模拟导线,使Guice获得模拟的对象依赖关系。
澄清:
class A {
@Inject B;
}
class B{
@Inject C;
}
bind(a.class).toInstance(mock(B.class));
在这种情况下,我不在乎B的依赖性,但是Guice剧照试图注入B。
有没有定义接口的方法可以避免这种情况?
首先,i 强烈建议不要在单位测试中使用依赖注入。当您单位测试单个类时,您应该创建它,并通过构造函数或方法直接通过其依赖关系。那您就不会遇到这些问题。
,当您编写集成测试时,这是另一个故事。您的问题有多种解决方案。
-
确保您的所有类仅通过可注射的构造函数接收依赖项。这种方式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);
您应该调整范围以满足您的需求。
使用Mockito部分解决这很容易。
您需要使用@Mock
和@InjectMocks
这样的注释
ATest{
@Mock B;
@InjectMocks A;
public void setUp(){
MockitoAnnotations.initMocks(this);
}
}
这样,莫科托将进行注入而不是guice,有几个限制可以成功地注入模拟。
这很好,直到您的代码对课程具有很强的依赖。
在A内,我有类似c obj = new C()之类的东西;c注射了字段。