2016-04-14 40 views

回答

62

當您知道模擬方法調用時的返回值時,應該使用thenReturndoReturn。當您調用模擬方法時,會返回此定義的值。

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"); 
} 
+0

謝謝@schlauergerd。現在我明白了。 –

+0

hi @Roland Weisleder但有時您應該返回一些生成的內部代碼值,而與參數無關。 'code = UUID.randomUUID()',我發現不可能用'mockito'實現這個。 – zhuguowei

+0

當你的模擬應該爲每個調用返回一個新的UUID時,你可以用'return UUID.randomUUID();'來實現'Answer'。 –