验证是否不再对特定方法进行任何交互

时间:2016-07-05 16:48:29

标签: java mockito

我想这样做:检查是否使用特定参数调用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

换句话说,我想验证报告错误的方式,但我不介意调试和信息。

我该怎么做?

2 个答案:

答案 0 :(得分: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());

答案 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参数。