验证期间的@SpyBean 和 Mockito.any()
@SpyBean and Mockito.any() during verify
我遇到了以下问题。我有一个 spring 启动测试,我在其中注入并监视 mongoDbChannel
bean。然后我尝试启动正常的工作流程并验证是否在 bean 上调用了方法 send
。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MongoAsBackupConfig.class},
properties = {},
webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class MongoAsBackupConfigTest {
@SpyBean(name = "mongoDbChannel")
private QueueChannel mongoDbChannel;
@Autowired
private DirectChannel mongoDbWithFailoverChannel;
@DirtiesContext
@Test
public void shouldUseFallbackForFullQueue() throws InterruptedException {
IntStream.rangeClosed(1, BACKUP_QUEUE_CAPACITY + OVERFILLING_CLICK_COUNT).forEach(someNumber ->
mongoDbWithFailoverChannel.send(MessageBuilder.withPayload(createPayload(someNumber)).build()));
verify(mongoDbChannel, times(BACKUP_QUEUE_CAPACITY)).send(Mockito.any());
}
}
因此,我收到 any
与具体参数值不匹配的错误消息。但是通常 any
表示参数的任何值。这里出了什么问题?
Argument(s) are different! Wanted:
mongoDbChannel.send(
<any>
);
-> at MongoAsBackupConfigTest.shouldUseFallbackForFullQueue(MongoAsBackupConfigTest.java:67)
Actual invocation has different arguments:
mongoDbChannel.send(
GenericMessage [payload=Click(...), headers={id=0eaa2317-b1b5-604d-65c5-78da521cd585, timestamp=1509085945379}],
10
);
-> at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
已编辑:
我用的是java 8,我试过用any(GenericMessage.class)
,any(Message.class)
,效果一样。
我假设你使用的是 java 8 这意味着当使用 Mockito.any()
时,编译器将根据 [=12] 的签名中的参数类型推断必须使用的类型=] 方法。
根据方法定义,这似乎是 Message
:send(Message<?> message)
实际传递的是GenericMessage
的一个实例。
因为我假设 GenericMessage
扩展了 Message
,那么你可以这样写你的 verify
:
verify(mongoDbChannel, times(BACKUP_QUEUE_CAPACITY))
.send(Mockito.any(GenericMessage.class));
更新
似乎还有一个重载方法send(Message<?> message, long timeout)
。也许这个版本被调用而不是单个 arg 版本..
我遇到了以下问题。我有一个 spring 启动测试,我在其中注入并监视 mongoDbChannel
bean。然后我尝试启动正常的工作流程并验证是否在 bean 上调用了方法 send
。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MongoAsBackupConfig.class},
properties = {},
webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class MongoAsBackupConfigTest {
@SpyBean(name = "mongoDbChannel")
private QueueChannel mongoDbChannel;
@Autowired
private DirectChannel mongoDbWithFailoverChannel;
@DirtiesContext
@Test
public void shouldUseFallbackForFullQueue() throws InterruptedException {
IntStream.rangeClosed(1, BACKUP_QUEUE_CAPACITY + OVERFILLING_CLICK_COUNT).forEach(someNumber ->
mongoDbWithFailoverChannel.send(MessageBuilder.withPayload(createPayload(someNumber)).build()));
verify(mongoDbChannel, times(BACKUP_QUEUE_CAPACITY)).send(Mockito.any());
}
}
因此,我收到 any
与具体参数值不匹配的错误消息。但是通常 any
表示参数的任何值。这里出了什么问题?
Argument(s) are different! Wanted:
mongoDbChannel.send(
<any>
);
-> at MongoAsBackupConfigTest.shouldUseFallbackForFullQueue(MongoAsBackupConfigTest.java:67)
Actual invocation has different arguments:
mongoDbChannel.send(
GenericMessage [payload=Click(...), headers={id=0eaa2317-b1b5-604d-65c5-78da521cd585, timestamp=1509085945379}],
10
);
-> at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115)
已编辑:
我用的是java 8,我试过用any(GenericMessage.class)
,any(Message.class)
,效果一样。
我假设你使用的是 java 8 这意味着当使用 Mockito.any()
时,编译器将根据 [=12] 的签名中的参数类型推断必须使用的类型=] 方法。
根据方法定义,这似乎是 Message
:send(Message<?> message)
实际传递的是GenericMessage
的一个实例。
因为我假设 GenericMessage
扩展了 Message
,那么你可以这样写你的 verify
:
verify(mongoDbChannel, times(BACKUP_QUEUE_CAPACITY))
.send(Mockito.any(GenericMessage.class));
更新
似乎还有一个重载方法send(Message<?> message, long timeout)
。也许这个版本被调用而不是单个 arg 版本..