2016-07-05 43 views
1

我想要做的:檢查是否error是用特定的參數調用一次,但我不在乎是否在同一個模擬上調用其他方法。驗證是否沒有更多的interations特定的方法

final Logger logger = mock(Logger.class); 

//code under test 
logger.debug("Something");//I don't care if it's here 
logger.error("Boo");// must be one 
//logger.error("Baa");// must fail if un-comment 
logger.info("Stuff");//I don't care if it's here 


//assertions 
verify(logger, times(1)).error("Boo"); 
???verify(logger, never()).error(anyString());// Wrong solution 
???verifyNoMoreInteractions(logger);// Wrong solution 

換句話說,我想驗證錯誤是如何報告的,但我不介意調試和信息。

我該怎麼辦?

+0

不只是'驗證(記錄器,次(1))。錯誤(「噓」);'做到這一點? – dty

+0

@dty如果logger.error(「Baa」)沒有被評論,但是我想要,它不會失敗。 – kan

+0

對不起,沒有抓住。在這種情況下,你應該看看Matchers類。您可以檢查一次是否使用「Boo」調用它,如果參數不等於「Boo」,則永遠不會。 – dty

回答

1

一般

如果你想檢查你接收香港專業教育學院正是x錯誤,但不關心在錯誤的文本:

verify(logger, times(x)).error(anyString()); 

如果您要檢查您收到x錯誤總量,並且y應該有文字fooz應該有文字bar

verify(logger, times(x)).error(anyString()); 
verify(logger, times(y)).error("foo"); 
verify(logger, times(z)).error("bar"); 
// ... (potentially other cases) 

在上下文

所以,對於實施例Y OU提供的,如果你不關心錯誤文本,它看起來像:

verify(logger, times(1)).error(anyString()); 

如果你不關心錯誤文本(IE:正是你想要1「噓」,和1個總誤差):

verify(logger, times(1)).error("Boo"); 
verify(logger, times(1)).error(anyString()); 

正如傑夫指出的那樣,如果您只查找一次發生,count參數可以忽略不計。

1

times(1)verify的默認行爲,所以verify(logger).error("Boo");應該就足夠了。 Mockito設計在a philosophy of "nice mocks",允許意外的操作,所以如果你堅持這一點,它是否被稱爲否則應該沒有關係。

如果你想查看其他呼叫,當你在註釋中列出,您可以使用notnever

verify(logger).error("Boo"); 
verify(logger, never()).error(not(eq("Boo"))); 

或者只是得到與ArgumentCaptor所有來電確認:

ArgumentCaptor<String> logCaptor = ArgumentCaptor.forClass(String.class); 
verify(logger).error(logCaptor.capture()); 
assertEquals("Boo", logCaptor.getValue()); 
+0

'不'在通常情況下不是很好的解決方案。試想一下,如果「錯誤」會有多個參數,或者我需要驗證幾個「錯誤」調用。 '驗證(記錄器,時間(howManyErrorsIExpect))。錯誤(任何()...)'更容易使用。 – kan

相關問題