【问题标题】:Test if the mail sent sucessfully using Java测试邮件是否使用Java成功发送
【发布时间】:2019-06-13 10:11:03
【问题描述】:

我有一个发送邮件的 mailingService:

@Component
public class MailingServiceImpl implements MailingService{

    @Autowired
    JavaMailSenderImpl mailSender;

    @Override
    public void sendMail(String sender, String receiver, String subject, String content) {

        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(sender);
        message.setTo(receiver);
        message.setSubject(subject);
        message.setText(content);
        mailSender.send(message);
    }
}

我正在为此void sendMail(...) 编写测试,我需要检查邮件是否发送成功。我找到了GreenMail,我目前正在尝试将其用于我的测试,代码如下:

public class MailingServiceImplTest {

    private MailingServiceImpl mailingServiceImpl;

    @Autowired
    private JavaMailSenderImpl mailSender;

    @PostConstruct
    public void testConnection() {
        try {
            mailSender.testConnection();
        } catch(MessagingException ex) {
            throw new IllegalStateException("[Warning] Mail server is not available. " + ex);
        }
    }

    @Rule
    public final GreenMailRule greenMail = new GreenMailRule(ServerSetupTest.SMTP);

    @Test
    public void testSendMail() throws IOException {
        GreenMailUtil.sendTextEmailTest(receiver, sender, subject, content);
        // GreenMailUtil.sendTextEmailTest(to, from, subject, body);  -- here I could use the GreenMailUtil sendTextEmailTest, but I need to use my void sendMail function
        MimeMessage[] emails = greenMail.getReceivedMessages();
//      assertEquals(1, emails.length);
    }

任何想法如何测试我的方法? GreenMail(如example'使用JUint(基于规则的设置)'部分)不是我尝试过的唯一工具,尝试过Dumbster(如下面的example,但sendMessage需要字符串作为参数,我无法通过我的方法。是我做错了吗?帮助

编辑

我对 JavaMailSenderImpl 的设置:

    @Bean
    public JavaMailSenderImpl mailSenderService(MailingServiceImpl mailingServiceImplementation,
            @Value("${mail.host}") String host,
            @Value("${mail.port}") int port,
            @Value("${mail.username}") String username,
            @Value("${mail.password}") String password) {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost(host);
        mailSender.setPort(port);
        mailSender.setUsername(username);
        mailSender.setPassword(password);
        return mailSender;
    }

最近在调试中发现@Autowired MailingServiceImplnull..但是为什么呢?我真的不明白。

【问题讨论】:

    标签: java spring unit-testing testing greenmail


    【解决方案1】:

    Greenmail 等正在启动可以从您的应用程序访问的本地 MailService。我还没有使用它,所以不要按原样使用代码,但从我的角度来看,你的测试应该看起来像什么。像这样:

    @Autowired
    private MailingServiceImpl mailingServiceImpl;
    
    @Rule
    public final GreenMailRule greenMail = new GreenMailRule(ServerSetupTest.SMTP);
    
    @Test
    public void testSendMail() throws IOException {
        mailingServiceImpl.sendMail("sender", "receiver", "subject", "content");
        MimeMessage[] emails = greenMail.getReceivedMessages();
        assertEquals(1, emails.length);
    }
    

    当然,您的 JavaMailSender 必须正确配置才能使用本地 GreenMail-SMTP 服务,当然您的 spring 测试设置必须正确(假设您要使用 spring)。

    当使用 spring boot 时,这样的配置就足够了:

    spring.mail.host=localhost
    spring.mail.port=3025 #Default port of greenmail?!
    

    【讨论】:

    • 我在mailingServiceImpl.senMail 收到NullPointerException。在调试模式下,我清楚地看到值不是空的...
    • 您要运行 Spring 测试吗?设置如何?
    • 是的,我想基本运行sendMail()的功能,并发送邮件到GreenMail SMTP服务器,检查邮件是否收到,邮件包含主题、内容等。
    • 嗯,我认为这与您最初的问题无关。你可以看看如何正确设置弹簧测试。也许以下链接会有所帮助:(docs.spring.io/spring/docs/current/spring-framework-reference/…)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多