我想这样做:检查是否使用特定参数调用error
一次,但我不在乎是否在同一个模拟器上调用其他方法。
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)
times(1)
是verify
的默认行为,因此verify(logger).error("Boo");
就足够了。 Mockito是在a philosophy of "nice mocks"上设计的,允许意外操作,所以如果坚持这一点,那么它是否被称为无关紧要。
如果您确实要查看评论中列出的其他来电,可以使用not
和never
:
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());
答案 1 :(得分:1)
一般
如果您想检查是否收到错误的x
错误,但不关心错误中的文字:
verify(logger, times(x)).error(anyString());
如果您想检查总共收到x
个错误,那么y
应该有文字foo
,而z
应该包含bar
文字:
verify(logger, times(x)).error(anyString());
verify(logger, times(y)).error("foo");
verify(logger, times(z)).error("bar");
// ... (potentially other cases)
在上下文中
因此,对于您提供的示例,如果您不关心错误文本,它将如下所示:
verify(logger, times(1)).error(anyString());
如果你关心错误文本(IE:你想要1&#34; Boo&#34;和1总错误):
verify(logger, times(1)).error("Boo");
verify(logger, times(1)).error(anyString());
正如杰夫所指出的那样,如果只查找一次出现,则可以忽略count参数。