我試圖測試class A
這反過來autowires一個class B
:Powermock的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與powermock
和mockito
在一起嘗試在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 class
的bar
方法進行了存根之後,bar
方法被調用。 在這種情況下,空指針異常是正常的,因爲B類未正確初始化。
任何人都可以解釋爲什麼發生這種情況,我能做些什麼。
謝謝你的回答凱文。你對'@PrepareForTest(B.class)'是正確的。我在A上使用spy(),因爲我需要在執行測試時調用'class A'的另一種方法。而你的權利,'Mockito.spy()'就足夠了。但是這些更正都沒有解決我的問題。 – 2012-07-19 19:30:34
你是否試圖在A的另一個方法上做明確的Mockito'verify(...)',在你的例子中沒有顯示?如果不是,那麼只需創建一個A的實例,讓Mockito注入模擬的B(如編輯答案所示),然後對A的第一個方法的調用將調用A中的另一個方法,沒有任何問題。 – 2012-07-19 19:40:48
我正在使用PowerMock而不是Mockito,因爲在此測試類中需要模擬靜態字段的其他測試方法。是的,我正在使用顯式驗證()來驗證方法正在被調用並捕獲它的參數。 – 2012-07-19 19:41:39