【问题标题】:Injecting MailClient in while testing in Spring Boot在 Spring Boot 中进行测试时注入 MailClient
【发布时间】:2017-03-15 21:00:35
【问题描述】:

我有这些类在我运行应用程序时运行良好。

@Service("bookManager")
public class BookManagerImpl implements BookManager {

    private MailClient mailClient;

..

}

   @Service
public class MailClient {

    protected static final Logger looger = LoggerFactory.getLogger(MailClient.class);

    @Autowired
    private JavaMailSender mailSender;

    private MailContentBuilder mailContentBuilder;

    @Autowired
    public MailClient(JavaMailSender mailSender, MailContentBuilder mailContentBuilder) {
        this.mailSender = mailSender;
        this.mailContentBuilder = mailContentBuilder;
    }

    //TODO: in a properties
    public void prepareAndSend(String recipient, String message) {
        MimeMessagePreparator messagePreparator = mimeMessage -> {
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
            messageHelper.setFrom("nunito@calzada.com");
            messageHelper.setTo(recipient);
            messageHelper.setSubject("Sample mail subject");
            String content = mailContentBuilder.build(message);
            messageHelper.setText(content, true);
        };
        try {
            if (looger.isDebugEnabled()) {
                looger.debug("sending email to " + recipient);
            }
            mailSender.send(messagePreparator);
        } catch (MailException e) {
            looger.error(e.getMessage());
        }
    }

}

我想创建一个 ServiceConfig 用于测试目的,但我不知道如何实例化 MailClient 类,因为它没有默认构造函数并且构造函数 MailClient() 未定义

@Configuration
public class ServiceConfig {

    @Bean
    public  SmsService smsService() {
        return new AWSSMSSender();
    }

    @Bean
    public  MailClient mailClient() {
        return new MailClient();
    }
}

使用建议的解决方案:

 return new MailClient(null, null) {
        @Override
        public void prepareAndSend(String recipient, String message)
        {
            // do nothing
        }
    };

我收到了这个错误:

    No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: expected at least 1 bean which qualifies as autowire candidate. 
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

【问题讨论】:

  • 什么是MailClient?它来自哪个库?
  • 为什么要为字段 mailSender 指定一个额外的@Autowired?我认为这是多余的,因为您已经通过构造函数注入了依赖项...
  • 真的,只是为了尝试。没有它我得到了同样的错误
  • 将 JavaMailSender 的实现添加到您的 ServiceConfig...Spring 想要自动装配它不知道的依赖项...您可以为此使用真实类或存根类...跨度>
  • 试一试,如果您在测试中删除了两个@Autowired 作品?

标签: spring spring-mvc spring-boot dependency-injection junit4


【解决方案1】:

您可以使用 GreenMail 在 Spring Boot 中测试您的电子邮件功能

你可以参考这个链接:http://dolszewski.com/spring/sending-html-mail-with-spring-boot-and-thymeleaf/

【讨论】:

    【解决方案2】:

    这取决于您想做什么,在测试中发送电子邮件(可能使用测试 smpt 服务器)或只是模拟发送。在第二种情况下,您可以将 MailClient 子类化为在 prepareAndSend 中不执行任何操作,然后使用它的实例。

       return new MailClient(null, null) {
            @Override
            public void prepareAndSend(String recipient, String message)
            {
                // do nothing
            }
        };
    

    【讨论】:

      【解决方案3】:

      你应该使用存根。

      存根方法易于使用,并且不涉及单元测试的额外依赖项。基本技术是将协作者实现为具体的类,这些类只展示被测类所需的协作者整体行为的一小部分。例如,考虑服务实现正在测试的情况。

      【讨论】:

        猜你喜欢
        • 2022-01-19
        • 2019-06-01
        • 2021-05-28
        • 1970-01-01
        • 2019-11-21
        • 2015-03-04
        • 1970-01-01
        • 2021-12-17
        • 2021-01-24
        相关资源
        最近更新 更多