40
我正在使用Mockito進行單元測試。我很困惑什麼時候使用doAnswer
vs thenReturn
。Mockito:doAnswer Vs然後返回
任何人都可以幫助我詳細?到目前爲止,我已用thenReturn
進行了嘗試。
我正在使用Mockito進行單元測試。我很困惑什麼時候使用doAnswer
vs thenReturn
。Mockito:doAnswer Vs然後返回
任何人都可以幫助我詳細?到目前爲止,我已用thenReturn
進行了嘗試。
當您知道模擬方法調用時的返回值時,應該使用thenReturn
或doReturn
。當您調用模擬方法時,會返回此定義的值。
thenReturn(T value)
設置方法調用時返回的返回值。
@Test
public void test_return() throws Exception {
Dummy dummy = mock(Dummy.class);
int returnValue = 5;
// choose your preferred way
when(dummy.stringLength("dummy")).thenReturn(returnValue);
doReturn(returnValue).when(dummy).stringLength("dummy");
}
Answer
用於當你需要做額外的動作被調用的模擬的方法時,例如當您需要根據此方法調用的參數計算返回值時。
使用
doAnswer()
當你想用存根通用Answer
一個void方法。Answer指定了一個被執行的動作和一個返回值,當你與模擬交互時返回。
@Test
public void test_answer() throws Exception {
Dummy dummy = mock(Dummy.class);
Answer<Integer> answer = new Answer<Integer>() {
public Integer answer(InvocationOnMock invocation) throws Throwable {
String string = invocation.getArgumentAt(0, String.class);
return string.length() * 2;
}
};
// choose your preferred way
when(dummy.stringLength("dummy")).thenAnswer(answer);
doAnswer(answer).when(dummy).stringLength("dummy");
}
謝謝@schlauergerd。現在我明白了。 –
hi @Roland Weisleder但有時您應該返回一些生成的內部代碼值,而與參數無關。 'code = UUID.randomUUID()',我發現不可能用'mockito'實現這個。 – zhuguowei
當你的模擬應該爲每個調用返回一個新的UUID時,你可以用'return UUID.randomUUID();'來實現'Answer'。 –