2012-07-19 57 views
2

我試圖測試class A這反過來autowires一個class BPowermock的Mockito:我想斯圖布方法最終被稱爲

public class A { 

    @Autowired 
    private B b; 

    public int foo(int x, int y) { 
     int z = b.bar(x, y, false); 
     //do something with z 
     return z; 
    } 
} 

我使用JUnit與powermockmockito在一起嘗試在class A中測試方法foo

@RunWith(PowerMockRunner.class) 
@PrepareForTest(A.class) 
public class TestA { 

    @Test 
    private void testFoo() { 
     B b = PowerMockito.mock(B.class); 
     when(b.bar(2,3,false)).thenReturn(5); 
     A a = PowerMockito.spy(new A()); 
     Whitebox.setInternalState(a, "b", b); 

     int z = a.foo(2,3); 
     Assert.assertEquals(10,z); 
    } 

} 

當我嘗試運行測試,我從class B內得到了NullPointerException。 在使用調試器後,我發現在對B classbar方法進行了存根之後,bar方法被調用。 在這種情況下,空指針異常是正常的,因爲B類未正確初始化。

任何人都可以解釋爲什麼發生這種情況,我能做些什麼。

回答

1

我不是PowerMockito用戶,但是您不需要使用@PrepareForTest(B.class)?我認爲這個註釋是針對你正在嘲笑的課程,它是最終的或者是靜態的,而不是被測試的課程。

另外,你爲什麼在A上使用spy()?也許你的示例代碼不公開它,但我沒有看到使用。此外,你是否真的需要PowerMockito.spy()爲A,或者只是簡單地使用Mockito的間諜()是足夠的(即 A &乙決賽和/或有靜態,你需要訪問/模擬/驗證)?

我可以問爲什麼你使用PowerMockito而不是Mockito?如果僅僅是將A中的私人B設置爲Whitebox,則可以單獨使用Mockito來完成。你只需要聲明的A和B的試驗方法之外:

@InjectMocks A a = new A(); 
@Mock B b; 

,它會注入所有的@Mock嘲笑(即b)爲A.

PowerMock是你身在何處的情況下最有用嘲笑靜態方法或最終類/方法。

+0

謝謝你的回答凱文。你對'@PrepareForTest(B.class)'是正確的。我在A上使用spy(),因爲我需要在執行測試時調用'class A'的另一種方法。而你的權利,'Mockito.spy()'就足夠了。但是這些更正都沒有解決我的問題。 – 2012-07-19 19:30:34

+0

你是否試圖在A的另一個方法上做明確的Mockito'verify(...)',在你的例子中沒有顯示?如果不是,那麼只需創建一個A的實例,讓Mockito注入模擬的B(如編輯答案所示),然後對A的第一個方法的調用將調用A中的另一個方法,沒有任何問題。 – 2012-07-19 19:40:48

+0

我正在使用PowerMock而不是Mockito,因爲在此測試類中需要模擬靜態字段的其他測試方法。是的,我正在使用顯式驗證()來驗證方法正在被調用並捕獲它的參數。 – 2012-07-19 19:41:39

相關問題