2015-08-28 145 views
5

我遇到了一个问题,其中对于@InjectMocks Mockito的@Mock注释的现场注入匹配在存在相同类型的2个@Mock的情况下不起作用。我已经使用了@Mock (name = "name_of_var")语法为好,但它还是没有......为什么在使用PowerMockRunner运行时无法使用@InjectMocks字段匹配?

下面是测试类:

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()); 
    } 

测试时,由于@InjectMocks不起作用,两个assertEquals都会导致NullPointerException

现在,当我用@RunWith(MockitoJUnitRunner.class)代替@RunWith(PowerMockRunner.class)时,它工作得很好。

另外,如果我刚刚定义的Parent.java 1个Date变量(比如,dateA)和匹配模拟在ParentTest注入,它只是罚款使用PowerMockRunner.class注入。

我必须运行PowerMockRunner.class的原因是我必须能够模拟静态函数以及构造函数。

我正在使用Junit4.12,Mockito-all-1.10.19和PowerMock-mockito-1.6.2-full。

有没有人看到为什么它不能正确注射的原因是PowerMockRunner.classPowerMockRunner.class运行时有没有解决方法?

回答

4

如果你要使用PowerMockRunner,你必须调用MockitoAnnotations.initMocks()以初始化所使用的注解创建的嘲笑。

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

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

相关问题