java - 测试已发送的电子邮件 - Dumbster 和 greenmail 未捕获已发送的 JavaMail

标签 java email testing jakarta-mail greenmail

我正在尝试整合 Dumbster测试我们基于 JavaMail 的传出电子邮件通知程序。电子邮件已发送,但在我的测试中 Dumbster 没有接收它们。我不确定我是否需要额外的配置才能使这项工作正常进行,但是在 dumbster 主页上它说,它将自动监听通过端口 25 上的 smtp 发送的邮件。

这是我们的 java 邮件设置:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.somewhere.com" />
    <property name="port" value="25" />
    <property name="username" value="theUserName" />
    <property name="password" value="thePassword" />

    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.starttls.enable">true</prop>
        </props>
    </property>
</bean>

我们的 Mailer 类只是注入(inject) JavaMailer:

@Component
public class OurMailer {

    @Inject
    private MailSender mailSender;

    public void sendMail(String from, String to, String subject, String msg) {

        SimpleMailMessage message = new SimpleMailMessage();

        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(msg);
        mailSender.send(message);
    }

测试非常简单,正如他们在页面上展示的那样:

@Inject
private OurMailer ourMailer;

@Test
public void ourMailer_should_send_mail() {
    SimpleSmtpServer server = SimpleSmtpServer.start();
    ourMailer.sendMail(FROM_EMAIL, TO_EMAIL, SUBJECT, MESSAGE);
    server.stop();
    Assert.assertTrue(server.getReceivedEmailSize() == 1);
}

正如我所说,邮件已发送但断言失败。

有什么想法吗?

顺便说一句:我也尝试过 Greenmail,但结果相同:

maven 略有不同:

    <dependency>
        <groupId>com.icegreen</groupId>
        <artifactId>greenmail</artifactId>
        <version>1.3.1b</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

测试

    GreenMail greenMail = new GreenMail(); //uses test ports by default
    greenMail.start();
    // send mail
    Assert.assertEquals("subject", greenMail.getReceivedMessages()[0].getSubject());
    greenMail.stop();

最佳答案

测试失败,因为配置显示“将邮件发送到 SMTP 服务器 smtp.somewhere.com”,但您想将其发送到运行于的 SimpleSmtpServer 本地主机

mailSender bean 的 host 参数使用系统属性,并在运行测试时将其设置为 localhost

也就是说,我建议将测试分成两部分。第一个测试应该只是确保使用正确的参数调用该方法。这样你就会知道代码试图在正确的时间发送邮件;在单元测试中测试 SMTP 身份验证、您的邮件服务器、邮件基础设施和网络没有什么意义 - 所有这些都由各自的制造商测试。

第二个测试应该只测试方法 sendMail() 方法。将该测试放入可以手动运行的测试套件中。您在这里想知道的是您是否正确设置和使用了 MailSender API。除非您更改 sendMail() 方法中的代码,否则您根本不必运行此测试。

这将加快您的单元测试并摆脱许多不必要的依赖项,即使您的代码工作正常,这些依赖项也会导致测试失败。

关于java - 测试已发送的电子邮件 - Dumbster 和 greenmail 未捕获已发送的 JavaMail,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12685865/

相关文章:

java - 把我所有的 bean 放在不同的文件中

java - 使用单一检查习语的惰性初始化

java - 使用 EWS 客户端只读未读邮件

Java和MAPI,需要什么Jar?

c++ - 测试字节顺序兼容性的工作流程

javascript - 具有异步功能的有状态 React 组件未通过 Jest 测试

java - 在 Java 中检查标志 "if(flag=true)"总是正确的?

javascript - 自动将文本添加到 mailto : link 中加载的电子邮件

angular - Angular 5 中用于单元测试的语言环境文件

java - HttpDelete 参数与 setEntity 在 android 上?