在使用PowerMockRunner运行时,为什么我不能使用@InjectMocks字段匹配?

时间:2015-08-28 04:09:55

标签: java unit-testing mockito code-injection powermock

我遇到了一个问题,即在有{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}}运行时是否有解决方法?

1 个答案:

答案 0 :(得分:5)

如果您要使用PowerMockRunner,则必须调用MockitoAnnotations.initMocks()才能初始化使用注释创建的模拟。

但是,有几个很好的理由不使用InjectMocks。一般来说,您对测试设置方式的控制较少。最好只需调用new并手动传递参数。此外,如果出现任何问题,Mockito将会默默地失败。 See more in this article

  

Mockito将尝试仅通过构造函数注入,setter注入或属性注入按顺序注入模拟,如下所述。如果以下任何一种策略失败,那么Mockito将不会报告失败;即你必须自己提供依赖。