2015-06-23 61 views
1

最簡單的例子:我有以下方法:嘲笑方法的返回參數結果

public String testMethod(String arg){ 
    ..... 
} 

我想嘲笑這個方法返回傳入的參數結果。例如:

testMethod("aString") returns "aString" 
testMethod("anotherString") returns "anotherString" 

我知道我可以硬編碼這種行爲,但我希望它是通用的。

+0

'String func(String arg){return arg; }' – twentylemon

+0

[Mockito:如何使方法返回傳遞給它的參數]的可能重複(http://stackoverflow.com/questions/2684630/mockito-how-to-make-a-method-return-一個參數,它被傳遞給它) –

回答

4

你可以寫你自己的Answer

when(mock.testMethod(anyString())).thenAnswer(new Answer<String>() { 
    @Override 
    public String answer(InvocationOnMock invocation) { 
     return invocation.getArgumentAt(0, String.class); 
    } 
}); 

或者:

when(mock.testMethod(anyString())) 
    .thenAnswer(AdditionalAnswers.<String>returnsFirstArg()); 
+0

感謝您的回覆,它解決了我的問題! 第二個解決方案返回null,但第一個解決方案完美匹配。 我試過類似的東西: when(mock.testMethod(anyString()))。thenReturn(returnsArgAt(0).toString()); 但在我的情況下不起作用,可能是我做錯了什麼。 –

+0

@Jean:避免使用'ClonesArguments',因爲它是一個內部包; AdditionalAnswers是去那裏的路。阿拉姆:'然後返回'會一直計算和保存一個價值的存根時間,這是很久之前你需要它。使用'thenAnswer(returnArgAt(0))'告訴Mockito使用Answer來計算value_,具體來說就是'returnsArgAt(0)'_給出的答案,所以你不應該在那裏調用'toString'。 –

+0

@JeffBowman你說得對,我沒有注意到它是內部的。我刪除它,並切換到''AdditionalAnswers''。 –

1

把它像這樣:

public String testMethod(String arg){ 
    return arg; 
} 
+2

我需要嘲笑這種行爲進行測試,我不想爲它更改代碼。 –

+0

@AramAslanyan我對「模擬」的含義並不確定。我不是說英語的人,我在翻譯中搜索,我認爲這句話對我來說沒有意義。 –

+1

它是Mockito框架中的術語:當您想要具有類似行爲的假對象時,您模擬對象。 –

1

通用,通用?您可以使用以下

public <T> T testMethod(T arg) { 
    return arg; 
} 

然後,你可以與任何類型的使用,

String s = testMethod("someString"); 
Integer i = testMethod(0); 
+2

不,這不是OP需要的。他想嘲笑該方法,以返回他傳遞給該方法的字符串。對於他的意思是「通用的」,他不希望爲'when(...)。then(...)'語句使用String文字。 – Tom

3

你可以實施彪自己Answer

Answer<String> returnArgAnswer = new Answer<String>() { 
    public String answer(InvocationOnMock invocationOnMock) throws Throwable { 
     return (String) invocationOnMock.getArguments()[0]; 
    } 
}; 

SomeClass x = mock(SomeClass.class); 
Mockito.when(x.testMethod(anyString())).thenAnswer(returnArgAnswer); 

然後調用x.testMethod與任何字符串將返回字符串。

1

這已經存在內置於Mockito 1.9.5及更高版本,作爲returnsFirstArg

when(mock.testMethod(anyString())).thenAnswer(returnsFirstArg()); 

您可能希望避免直接使用ClonesArguments,因爲它是在內部包org.mockito.internal.stubbing.answers。 Mockito的靜態工廠類是獲得Mockito的預定義答案和匹配器的首選方式。