我遇到了一个问题,即在有{2} @Mock
的情况下,@InjectMocks
的Mockito @Mock
注释的字段注入匹配不起作用相同类型的s。我也使用了@Mock (name = "name_of_var")
语法,但它仍然失败了......
以下是受测试的课程:
import java.util.Date;
public class Parent{
private Date dateA;
private Date dateB;
public void setDateA(Date _dateA){
dateA = _dateA;
}
public void setDateB(Date _dateB){
dateB = _dateB;
}
public Date getDateA(){
return dateA;
}
public Date getDateB(){
return dateB;
}
这是测试本身:
@RunWith(PowerMockRunner.class)
@PrepareForTest({System.class, Parent.class})
public class testParent{
@Mock (name = "dateB") private Date someOtherDate;
@Mock (name = "dateA") private Date someDate;
@InjectMocks Parent p;
@Before
public void setup(){
Mockito.when(someOtherDate.getTime()).thenReturn(500l);
PowerMockito.mockStatic(System.class);
PowerMockito.when(System.currentTimeMillis()).thenReturn(2000l);
}
@Test
public void testGetDateAGetTimeShouldReturn1000() {
Mockito.when(someDate.getTime()).thenReturn(1000l);
Date result = p.getDateA();
assertEquals(1000l, result.getTime());
}
@Test
public void testGetDateBGetTimeShouldReturn500() {
Date result = p.getDateB();
assertEquals(500l, result.getTime());
}
经过测试,由于assertEquals
不起作用,NullPointerException
@InjectMocks
会导致@RunWith(PowerMockRunner.class)
。
现在,当我用@RunWith(MockitoJUnitRunner.class)
替换Date
时,它运作得很好。
另外,如果我刚刚在dateA
中定义了1个Parent.java
变量(例如,ParentTest
),并且在PowerMockRunner.class
中注入了匹配模拟,那么它会注入正常使用PowerMockRunner.class
。
我必须使用PowerMockRunner.class运行的原因是因为我必须能够模拟静态函数以及构造函数。
我正在使用Junit4.12,Mockito-all-1.10.19和PowerMock-mockito-1.6.2-full。
有没有人看到导致PowerMockRunner.class
无法正常注入的原因?在使用{{1}}运行时是否有解决方法?
答案 0 :(得分:5)
如果您要使用PowerMockRunner
,则必须调用MockitoAnnotations.initMocks()
才能初始化使用注释创建的模拟。
但是,有几个很好的理由不使用InjectMocks
。一般来说,您对测试设置方式的控制较少。最好只需调用new
并手动传递参数。此外,如果出现任何问题,Mockito将会默默地失败。 See more in this article:
Mockito将尝试仅通过构造函数注入,setter注入或属性注入按顺序注入模拟,如下所述。如果以下任何一种策略失败,那么Mockito将不会报告失败;即你必须自己提供依赖。