不管现在各种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工具类是Java开发中用于发送电子邮件的实用程序,它极大地简化了通过SMTP(简单邮件传输协议)或类似的协议发送邮件的过程。在Java中,JavaMail API提供了一个标准的接口来处理邮件服务,而JavaMail工具类是...
在这个测试方法中,你可以使用JavaMail API或其他邮件库(如Spring的JavaMailSender)来发送邮件。邮件发送后,greenmail会捕获到这些邮件,你可以通过greenmail提供的API来检查邮件内容。 此外,如果你想要将这个...
自己编写的发送邮件的工具类,将细节封装了起来,用起来很简单
javamail测试类,支持新浪,163,qq方式,下载资源注意上传时间
根据提供的文件信息,我们可以分析出该文件主要涉及的是JavaMail的使用以及部分涉及到Struts框架的应用。虽然实际的JavaMail代码未完整展示出来,但从文件的结构和其他线索中,我们仍可以提炼出以下相关的知识点: ...
JavaMail邮件发送工具类是Java开发中用于发送电子邮件的标准库,它提供了丰富的API来处理复杂的邮件功能。在JavaMail中,我们可以通过创建特定的类和对象来实现邮件的发送。以下将详细介绍这些类以及如何使用它们。 ...
1. **JavaMail工具开发.jar包** 这个jar包包含了JavaMail的核心库,其中包括`javax.mail`和`javax.mail.internet`等关键包。开发者可以通过导入这个库,调用其提供的类和方法来实现邮件的发送和接收。例如,`...
Spring支持JavaMail发送的Jar包,在Spring默认的jar包中没有,这个是自己封装的jar包
封装了javamail底层实现,可以实现简单文本邮件的发送和html格式的邮件发送。
JavaMail 是一个开源的 ...总的来说,JavaMail 和 JAF 是 Java 开发者处理电子邮件不可或缺的工具,它们简化了邮件操作,并提供了强大的附件处理能力。理解和掌握这两个库,可以有效地提高邮件功能的开发效率和质量。
JavaMail 是一个强大的开源库,用于在Java应用程序中实现电子邮件的发送和接收功能。它提供了丰富的API,使得开发者能够方便地处理SMTP、POP3、IMAP等邮件协议,支持多种邮件格式,包括文本、HTML以及带有附件的邮件...
JavaMail 是一个开源的 Java API,它为 ...JavaMail 和 JAF 在企业级应用、自动化测试、Web 服务和邮件通知系统等场景中广泛应用。它们提供了一种标准化、高效且灵活的方式来处理电子邮件,极大地简化了开发者的工作。
对于想要在Java环境中开发邮件功能的开发者来说,这是一个非常全面的工具包。通过学习和使用这些资源,开发者可以熟练掌握如何使用JavaMail和JAF来实现复杂的邮件操作,例如发送带附件的邮件、处理邮件事件、读取...
JavaMail API是Java平台上用于处理电子邮件的一套标准API,它为...总之,JavaMail API和`javaMail.jar`是Java开发者处理电子邮件不可或缺的工具,它们提供了强大的功能,使得在程序中发送和接收邮件变得简单易行。
JavaMail 是一个开源库,用于在Java应用程序中处理电子邮件。这个库提供了丰富的API,使得开发者可以方便地执行发送、接收、读取和管理邮件的任务。`javamail-1.6`是JavaMail的一个版本,它包含了从早期版本中继承的...
这个工具可以帮助开发者在JavaMail配置中添加自签名或不受主流CA认可的服务器证书。 6. **Java Keystore**: Java使用Keystore作为证书存储的地方,包含公钥证书和私钥。`keytool` 是Java提供的命令行工具,用于管理...
总的来说,JavaMail 1.6.0 Final Release 是一个强大的工具,对于任何需要在 Java 应用程序中集成电子邮件功能的开发者来说,它都是不可或缺的。通过其丰富的 API,开发者可以轻松地构建功能完备的邮件系统,无论是...
javamail发送邮件的简单实例