junit4 - MIMEMessage 和 MIMEMessage 模拟测试用例因 EmailUtil 上的断言错误而失败
问题描述
我想要实现的目标- 我为 Spring MVC 应用程序编写的 EmailUtil 的简单单元测试。 我被困在哪里- 虽然我已经模拟了 MIMEmessage 和 JavaMailSender,但测试用例在 MimeMessageHelper.set**** 方法中失败。
感谢您对此的任何帮助,因为即使使用 PowerMock,我也尝试了几种不同的方法,而且过去几天没有运气。
EmailUtil.Java
import java.util.List;
import javax.activation.DataSource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.mail.util.ByteArrayDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import com.dashboard.domain.Attachment;
import com.dashboard.domain.Email;
public class EmailUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(EmailUtil.class
.getName());
/**
* Private constructor to make sure that no one creating instance
*/
private EmailUtil() {
}
/**
* Functionality to send the mail. This method used the mail sender
* configuration from spring-context file.
*
* @param email
* @param mailSender
* @throws MessagingException
*/
public static void sendEmail(JavaMailSender mailSender, Email email)
throws MessagingException {
LOGGER.info("Start of the method: sendEmail");
MimeMessage mimeMessage = mailSender.createMimeMessage();
// use the true flag to indicate you need a multi part message
boolean hasAttachments = email.getAttachments() != null
&& !email.getAttachments().isEmpty();
LOGGER.info(" mimeMessage - {} ",mimeMessage);
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,
hasAttachments);
LOGGER.info(" MimeMessageHelper - {} ",helper);
helper.setTo(email.getTo());
helper.setFrom(email.getFrom());
helper.setCc(email.getCc());
helper.setSubject(email.getSubject());
helper.setText(email.getText(), true);
List<Attachment> attachments = email.getAttachments();
if (!attachments.isEmpty()) {
for (Attachment attachment : attachments) {
String filename = attachment.getFilename();
DataSource dataSource = new ByteArrayDataSource(
attachment.getData(), attachment.getMimeType());
if (attachment.isInline()) {
helper.addInline(filename, dataSource);
} else {
helper.addAttachment(filename, dataSource);
}
}
}
mailSender.send(mimeMessage);
LOGGER.info("End of the method: sendEmail");
}
}
EmailUtilTest.Java
import static org.easymock.EasyMock.expect;
import javax.mail.Address;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import org.easymock.EasyMock;
import org.easymock.Mock;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import com.dashboard.domain.ApplicationConstant;
import com.dashboard.domain.Email;
/**
* PowerMockDemo
* @author s.arumugam
*
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(EmailUtil.class)
public class EmailUtilTest {
Email email = new Email();
@Mock
JavaMailSender javaMailSender;
@Mock
MimeMessage mimeMessage;
@Mock
MimeMessageHelper mimeMessageHelper;
@Before
public void initList() {
email.setFrom(ApplicationConstant.DEFAULT_MAIL_ID.getValue());
email.setSubject("Subject");
email.setTo("to.email@userdomain.com");
email.setCc("admin@dashboard.com");
email.setText("Body of the email");
}
@Test
public void sendEmailTest() throws Exception{
mimeMessageHelper.setSubject(email.getSubject());
mimeMessageHelper.setFrom(new InternetAddress(email.getFrom(), true));
mimeMessageHelper.setCc(new InternetAddress(email.getCc()[0], true));
mimeMessageHelper.setTo(new InternetAddress(email.getTo()[0], true));
mimeMessageHelper.setText(email.getText());
expect(javaMailSender.createMimeMessage()).andReturn(mimeMessage);
Address sendTo[]={new InternetAddress(email.getTo()[0])};
mimeMessage.setRecipients(RecipientType.TO,sendTo);
EasyMock.expectLastCall().times(1);
EasyMock.replay(mimeMessage);
EasyMock.replay(javaMailSender);
EmailUtil.sendEmail(javaMailSender, email);
EasyMock.verify(mimeMessage);
EasyMock.verify(javaMailSender);
}
}
错误信息:
java.lang.AssertionError: Unexpected method call MimeMessage.setRecipients(To, [to.email@userdomain.com]):
MimeMessage.setRecipients(To, [to.email@userdomain.com]): expected: 1, actual: 0 at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44) at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:94) at org.easymock.internal.ClassProxyFactory$MockMethodInterceptor.intercept(ClassProxyFactory.java:97) at $javax.mail.internet.MimeMessage$$EnhancerByCGLIB$$a6025b60.setRecipients(<generated>) at org.springframework.mail.javamail.MimeMessageHelper.setTo(MimeMessageHelper.java:581) at org.springframework.mail.javamail.MimeMessageHelper.setTo(MimeMessageHelper.java:595) at com.dashboard.util.EmailUtil.sendEmail(EmailUtil.java:50)
解决方案
哦..我设法解决了这个问题..纯粹是通过随机试验和错误..!这就是说我需要深入了解这些模拟工具的工作原理。下面的工作测试用例希望有人能找到一个完整的测试用例工作示例;
@RunWith(EasyMockRunner.class)
public class EmailUtilTest extends EasyMockSupport{
@Mock
JavaMailSender mailSender;
@Mock
MimeMessage mimeMessage;
@Test
public void testSendEmail() throws MessagingException{
Email email = new Email();
email.setFrom("from.email@dashboard.com");
email.setSubject("Subject");
email.setTo("to.email@userdomain.com");
email.setCc("admin@dashboard.com");
email.setText("Body of the email");
EasyMock.expect(mailSender.createMimeMessage()).andReturn(mimeMessage);
mailSender.send(mimeMessage);
EasyMock.expectLastCall();
EasyMock.replay(mailSender);
EmailUtil.sendEmail(mailSender, email);
EasyMock.verify(mailSender);
}
}
推荐阅读
- java - 测试继承的构造函数时出现类型不匹配错误
- ruby-on-rails - 在 has_one 关联中按父属性排序子模型
- spring - : 在类路径资源中定义名称为“entityManagerFactory”的 bean 创建错误
- r - 创建从各种其他变量的可能组合计算得出的变量
- excel - 判断指定范围内是否有匹配值
- sql-server - SQL Server:递归和开销
- postgresql - 使用 Python 代码将带有偏移量的日期插入 PostgreSQL 数据库
- javascript - 使用 ajax 和 laravel 提交表单
- javascript - AngularJS 重定向控制器和历史回溯问题
- html - 面临使用 VBA 从网站中提取数据的问题