不管现在各种Mock框架的运用有多广,我个人在写单元测试的时候还是特别烦Mock,原因如下:
- 1. 使用Mock需要Mock所有涉及到得行为,这其实代表了我们是在测试实现,而不是测试执行过程。这样会导致重构的时候经常需要修改很多测试代码。测试应该只关注输入输出,只要输入输出没变,就不应该影响测试。
- 2. 增加代码复杂度。
- 3. Mock的时候会不小心屏蔽掉一些实现,增加风险
但是在实际的开发工作中,总是免不了存在外部依赖,比方说依赖某个WebService,或者某个MQ服务,再或者某个Email服务器等等,对于这些外部服务,我更趋向于Stub服务,而不是Mock服务。Stub服务是程序真的和外部的一个服务进行了交互,更符合真实情况。Stub Web Service我会使用DreamHead的Moco框架;MQ服务我会使用ActiveMQ构造一个临时的MQ服务器;而Email呢,我会使用GreeMail构建一个临时的Mail服务器。
Junit和GreenMail
假设我要测试自己的一个MailSender,我会首先把green Mail添加到测试依赖中,然后在Junit测试的setup和teardown中分别启动和关闭Mail Server即可, 代码如下:
public class MyMailSenderTest {
private MyMailSender mailSender;
private GreenMail mailServer;
@Before
public void setUp() throws Exception {
mailServer = new GreenMail(new ServerSetup(12000, null, "smtp"));
mailServer.start();
mailSender = new MyMailSender("localhost", 12000);
}
@After
public void tearDown() throws Exception {
mailServer.stop();
}
@Test
public void shouldSendEmailToServer() throws Exception {
mailSender.sendEmail("Unit Test for java mail Demo");
String receivedMessage = (String) mailServer.getReceivedMessages()[0].getContent();
assertThat(receivedMessage.trim(), equalTo("Unit Test for java mail Demo"));
}
}
实现代码如下:
public class MyMailSender {
private JavaMailSender mailSender;
public boolean sendEmail() {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
mimeMessageHelper.setFrom("xianlinbox@gmail.com");
mimeMessageHelper.setTo("xianlinbox@163.com");
mimeMessageHelper.setText("Unit Test for java mail Demo");
mailSender.send(mimeMessageHelper.getMimeMessage());
return true;
} catch (MessagingException e) {
return false;
}
}
}
GreenMail还支持验证该消息的确是发送给了某个用户,在上面的实现中,我们要求发送给用户xianlinbox@163.com, 可以通过如下的代码验证如下:
@Test
public void shouldSendToSpecifiedUser() throws Exception {
mailSender.sendEmail("Unit Test for java mail Demo");
GreenMailUser greenMailUser = mailServer.setUser("xianlinbox@163.com", null);
MailFolder inbox = mailServer.getManagers().getImapHostManager().getInbox(greenMailUser);
List<StoredMessage> messages = inbox.getMessages();
assertThat(messages.size(),equalTo(1));
String content = (String) messages.get(0).getMimeMessage().getContent();
assertThat(content.trim(), equalTo("Unit Test for java mail Demo"));
}
更多用法,参加官网:
http://www.icegreen.com/greenmail/
分享到:
相关推荐
可以使用模拟邮件服务器(如GreenMail)来进行单元测试,避免实际发送邮件对用户造成干扰。 通过理解和应用上述知识点,你可以构建一个高效、稳定的JavaMail工具类,实现邮件的发送、接收和管理功能。同时,结合`...
在这个测试方法中,你可以使用JavaMail API或其他邮件库(如Spring的JavaMailSender)来发送邮件。邮件发送后,greenmail会捕获到这些邮件,你可以通过greenmail提供的API来检查邮件内容。 此外,如果你想要将这个...
10. **测试**:在开发过程中,可以使用像`GreenMail`这样的测试库来模拟邮件服务器,以便在不实际发送邮件的情况下测试代码。 总之,JavaMail和Apache Commons Email是强大的邮件处理工具,它们极大地简化了在Java...
9. **集成测试**:使用模拟邮件服务器(如 GreenMail)进行单元测试,可以避免在开发环境中实际发送邮件。 10. **邮件模板**:为了提高效率和一致性,可以使用模板引擎(如 FreeMarker 或 Velocity)创建邮件模板,...
工具方面,有一些可视化的邮件调试工具,如Eclipse的插件GreenMail,可以帮助开发者测试邮件发送功能。 总之,JavaMail是Java开发中处理邮件的核心库,它提供了丰富的API来满足各种邮件需求。理解和熟练运用...
为了测试和调试邮件发送功能,可以使用像`GreenMail`这样的测试工具。GreenMail是一个服务器模拟器,可以在本地环境接收和检查发送的邮件,无需实际连接到SMTP服务器。 8. **最佳实践**: - 为避免暴露敏感信息,...
4. **邮件模拟服务器**: 在测试阶段,为了避免实际发送邮件,可以使用模拟邮件服务器,如GreenMail。这个服务器可以在本地运行,接收并存储发送的邮件,以便开发者检查邮件格式和内容。 5. **邮件发送过程**: - **...
同时,也可以使用模拟邮件服务器(如GreenMail)进行单元测试,确保邮件发送功能的正确性。 总的来说,JavaMail API为Java开发者提供了强大且灵活的邮件处理能力,是实现自动化邮件发送不可或缺的工具。通过深入...