我正在使用Mockito编写单元测试,我在模拟注入的类时遇到了问题。问题是两个注入的类是相同的类型,只有它们的@Qualifier
注释区分。如果我试图简单地模拟SomeClass.class
,则不会注入该模型,并且在我的测试中该对象为null
。我该如何模仿这些物体?
public class ProfileDAL {
@Inject
@Qualifier("qualifierA")
private SomeClass someClassA ;
@Inject
@Qualifier("qualifierB")
private SomeClass someClassB ;
//...various code, not important
}
@RunWith(MockitoJUnitRunner.class)
public class ProfileDALLOMImplTest {
@InjectMocks
private ProfileDALLOMImpl profileDALLOMImpl = new ProfileDALLOMImpl();
@Mock
private SomeClass someClassA;
@Mock
private SomeClass someClassB;
private SomeResult mockSomeResult = mock(SomeResult.class);
@Test
public void testSomeMethod() {
when(someClassA .getSomething(any(SomeArgment.class)).thenReturn(mockSomeResult);
Int result = profileDALLOMImpl.someTest(This isn't relevant);
}
}
答案 0 :(得分:9)
我尝试使用JUnit使用Mockito 1.9.5模拟两个具有相同类型的对象并且它可以工作。
请参阅:http://static.javadoc.io/org.mockito/mockito-core/1.9.5/org/mockito/InjectMocks.html
来自doc的相关类型信息:
“字段注入;模拟将首先按类型解析,然后,如果存在多个相同类型的属性,则通过字段名称和模拟名称的匹配来解析。”
这个似乎说你应该让模拟名称与你所有模拟的字段名称相匹配,当你有两个相同的类型时:
“注1:如果你有相同类型(或相同的擦除)的字段,最好用匹配的字段命名所有@Mock
注释字段,否则Mockito可能会感到困惑,注入不会发生。 “
也许后者会咬你?
答案 1 :(得分:1)
刚刚确认了Splonk指出的内容,它在Mockito 1.9.5中的运行方式,只要我删除了一个模拟类,就失败了。
因此,在您的情况下,请确保您的两个模拟类与测试中的类具有相同的名称:
@Mock
private SomeClass someClassA;
@Mock
private SomeClass someClassB;
答案 2 :(得分:0)
如果您不使用注释,则会得到类似
的内容public class MyClass {
private MyDependency myDependency;
public void setMyDependency(MyDependency myDependency){
this.myDependency = myDependency;
}
}
和
import org.junit.Before;
import org.junit.Test;
import static org.mockito.Mockito.*;
public class MyTest {
private MyClass myClass;
private MyDependency myDependency;
@Before
public void setUp(){
myClass = new MyClass();
myDependency = mock(MyDependency.class);
myClass.setMyDependency(myDependency);
}
@Test
public void test(){
// Given
// When
// Then
}
}
如果您的对象通过构造函数而不是通过setter指定了依赖项,则可以执行相同的操作。我想你的依赖注入框架可以像注释私有字段一样注释setter,但现在你的测试不依赖于任何依赖注入框架。