我想模擬TestNG測試用例中的具體類。類可能看起來像這樣(簡化的例子):如何初始化一個真實類的模擬
public class Example() {
private MyHello myHello;
public Example(MyHello myHello) {
this.myHello = myHello;
}
public String doSomething() {
return myHello.doSomethingElse();
}
}
現在,我們需要模擬Example
返回一些定義的值:
@BeforeMethod
public void setUp() {
this.example = mock(Example.class);
when(this.example.doSomething()).thenReturn("dummyValue");
}
這看起來相當不錯,但實際上卻並非如此。 setup方法的最後一行調用Example
實例的方法,這個實例沒有通過構造函數得到MyHello
,所以我在setUp方法中得到了一個NPE。
有沒有辦法在創建模擬時注入MyHello
或不允許Mockito調用真實實例上的方法?
編輯
問題,導致該觀測到的行爲,該doSomething()
方法實際上是final
。當我試圖解決這個問題時,我忽略了這一點。 And this is a known limitation with mockito anyway。所以我要麼刪除決賽或者爲這個類提取一個接口。
你真的運行過你的例子嗎?它是否生產NPE? 它不應該,除非Mockito以奇怪的方式與CDI/Guice交互。 –
是的,我真的碰到了NPE。它應該以這種方式工作?我想我會清理整個環境(再次),然後再試一次。 –
問題解決(facepalm)。方法'doSomething()'是'final'。我忽略了這一點。這是一個衆所周知的限制(http://stackoverflow.com/a/3794448/105224) –