我真的不在乎什么时候调用模拟 - 几乎,我正在将一堆模拟迁移到现实世界的代码中,因为集成测试中的模拟有时非常愚蠢。
无论如何,我在这里有一个充满模拟设置的巨大类 - 但我真正想要的是每次测试都找出使用了哪些模拟。
使用mockito,我是否可以在实际执行特定“何时”时将其“记录”或打印或其他内容?
从 Mockito 1.9.0 开始,您可以使用verboseLogging设置。
例如,这个:
@Test
public void testLogging() {
final List<?> mockList = mock(List.class, withSettings().verboseLogging());
when(mockList.size()).thenReturn(6);
mockList.size();
}
产生:
###### 在模拟/间谍上记录方法调用 #1 ######## list.size(); 调用:-> 在soanswers.mockito.LogCalls.testLogging(LogCalls.java:35) 已返回:"0" (java.lang.Integer)
###### 在模拟/间谍上记录方法调用 #2 ######## 存根:-> 在soanswers.mockito.LogCalls.testLogging(LogCalls.java:35) list.size(); 调用:-> 在 soanswers.mockito.LogCalls.testLogging(LogCalls.java:37) 已返回:"6" (java.lang.Integer)
我在 mockito 网页上发现了一个问题,表明这是可能的: http ://code.google.com/p/mockito/issues/detail?id=148
嗨,我已经在以下分支准备了一个补丁。对于任何需要更改的内容,我将不胜感激。
http://code.google.com/r/muratknecht-mockito-issue148/
API 已达成一致:
Foo foo = mock(Foo.class, withSettings().verboseLogging());
和
Foo foo = mock(Foo.class, withSettings().callback(new RememberingListener()));
前者将调用信息打印到标准输出。这里举个例子。当然,这只是一个提议。但是,位置信息(-> at ...)只是侦听器获得的信息,因此如果不公开 Location 及其字段就无法更改。
###### 在模拟/间谍上记录方法调用 #3 ######## foo.giveMeSomeString("another string value"); -> 在org.mockitousage.debugging.VerboseLoggingOfInvocationsOnMockTest.usage(VerboseLoggingOfInvocationsOnMockTest.java:154) 将返回:>some return value< (java.lang.String) 方法已被存根。-> 在 org.mockitousage.debugging.VerboseLoggingOfInvocationsOnMockTest.usage(VerboseLoggingOfInvocationsOnMockTest.java:149)
#使用级别测试是 InvocationListenerCallbackTest 和 VerboseLoggingOfInvocationsOnMockTest。你可能想仔细看看后者(见课堂评论)。与对标准输出流的内容进行断言的使用级别测试一样,它变得有点混乱。
我在我的一项测试中进行了尝试,它似乎可以满足您的要求。您应该使用如下所示的第一个示例:
Foo foo = mock(Foo.class, withSettings().verboseLogging());