【问题标题】:Spring mockito bean still does nothing, despite doAnswer setting尽管设置了 doAnswer,但 Spring mockito bean 仍然什么都不做
【发布时间】: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


【解决方案1】:

好的,我终于发现即使编译器允许将可变参数视为数组,调用参数仍会将参数视为单独的实体。

@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 (int i = 2; i < invocation.getArguments().length; i++) {
            log.info("DEST: {}", (String) invocation.getArgument(i));
        }
        return null;    // Void
    }).when(sender)
      .sendMessage(anyString(), anyString(), (String[]) any());
    // invoking the service, depending on the above stub
    service.monitor();
}

【讨论】:

    猜你喜欢
    • 2021-04-13
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2019-10-19
    相关资源
    最近更新 更多