【发布时间】:2020-05-14 11:52:25
【问题描述】:
我正在尝试在其 void 方法上存根注入的依赖项:
@Autowired
private FeedbackService service;
@MockBean
private MailSender sender;
@Test
public void testMonitor() {
// mocking MailSender#sendMessage
Mockito.doAnswer(invocation -> {
log.info("SUBJECT: {}", invocation.getArgument(0, String.class));
log.info("CONTENT: {}", invocation.getArgument(1, String.class));
for (String dest : (String[]) invocation.getArgument(2)) {
log.info("DEST: {}", dest);
}
return null; // Void anyway
}).when(sender).sendMessage(anyString(), anyString(), any(String[].class)); //FIXME still doNothing
// invoking the service which calls MailSender#sendMessage
service.monitor();
}
但是日志记录和调试显示在运行时没有发生拦截。 请问有人知道我做错了什么吗?
字符串数组的转换似乎比我想象的要复杂。这用作拦截器:
.sendMessage(anyString(), anyString(), any());
但是第三个参数是作为字符串而不是字符串数组到达的。 注意:第三个参数是可变参数,但 #anyVararg 也不起作用。
【问题讨论】:
-
what 调用了
sendMessage方法?请出示该代码?是否有任何参数null?如果是这样,anyString()等将不起作用,您需要改用nullable(String.class)。 -
在这种情况下没有参数为空
-
如前所述,请显示调用此方法的代码,以及
sendMessage方法的签名。 -
你在这里: void sendMessage(String subject, String text, String... to);它实际上是一个椭圆,虽然
-
varargs 不是数组,因此它不匹配因此没有拦截。在拦截中,您可以使用
getArguments并将它们打印出来。
标签: spring testing mocking mockito spring-test