测试已发送的电子邮件 - Dumbster 和 greenmail 未捕获已发送的 JavaMail
题
我正在尝试整合 阿呆 测试我们基于 JavaMail 的外发电子邮件通知程序。电子邮件已发送,但在我的测试中,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 类只是注入 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
其运行于 localhost
使用系统属性 host
的参数 mailSender
豆并将其设置为 localhost
当你运行测试时。
也就是说,我建议将测试分成两部分。第一个测试应该确保使用正确的参数调用该方法。这样您就会知道代码尝试在正确的时间发送邮件;在单元测试中测试 SMTP 身份验证、邮件服务器、邮件基础设施和网络没有什么意义 - 所有这些都由各自的制造商进行测试。
第二次测试应该只测试该方法 sendMail()
方法。将该测试放入可以手动运行的测试套件中。这里您想知道的是您是否正确设置和使用 MailSender
API。除非你改变里面的代码 sendMail()
方法,您根本不必运行此测试。
这将加快您的单元测试速度,并消除许多不必要的依赖项,这些依赖项可能导致测试失败,即使您的代码工作正常。
其他提示
注意:似乎有更新的笨蛋版本(从原始来源提供)可能已经修复了您遇到的挂起错误:
sourceforge.net/p/dumbster/patches/9 /
https://github.com/rjo1970/dumbster
git-wip-us.apache.org/repos/asf?p=logging-log4j2.git;== commit; h=b0f7be4b0666dca22205e6df5c7374677daa416e
和Greenmail这些天似乎在这里居住: