1

我真的不在乎什么时候调用模拟 - 几乎,我正在将一堆模拟迁移到现实世界的代码中,因为集成测试中的模拟有时非常愚蠢。

无论如何,我在这里有一个充满模拟设置的巨大类 - 但我真正想要的是每次测试都找出使用了哪些模拟。

使用mockito,我是否可以在实际执行特定“何时”时将其“记录”或打印或其他内容?

4

2 回答 2

4

从 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)

于 2013-02-14T19:35:42.260 回答
1

我在 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());
于 2013-02-14T19:32:58.467 回答