2015-08-28 18 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不會報告失敗;即您必須自己提供依賴關係。

相關問題