Java 如何在不发送电子邮件的情况下使用Mockito测试sendEmail()方法?
我需要你帮助使用Mockito进行单元测试。 我的项目只有DAO和服务,所以它是web项目。 我有接口Java 如何在不发送电子邮件的情况下使用Mockito测试sendEmail()方法?,java,spring,unit-testing,junit,mockito,Java,Spring,Unit Testing,Junit,Mockito,我需要你帮助使用Mockito进行单元测试。 我的项目只有DAO和服务,所以它是web项目。 我有接口EmailDao和它的实现EmailDaoImpl类。现在我在EmailDaoImpl中有了用于测试方法的简单jUnit测试。这是一种方法sendmail(EmailParams-params),它执行诸如身份验证、在对象EmailParams中正确设置参数、调用其他方法将电子邮件副本保存到文件系统等操作。。当然,还有发送电子邮件 我的实际测试类如下所示: @RunWith(SpringJUni
EmailDao
和它的实现EmailDaoImpl
类。现在我在EmailDaoImpl
中有了用于测试方法的简单jUnit测试。这是一种方法sendmail(EmailParams-params)
,它执行诸如身份验证、在对象EmailParams
中正确设置参数、调用其他方法将电子邮件副本保存到文件系统等操作。。当然,还有发送电子邮件
我的实际测试类如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/applicationContext.xml"})
@Transactional
@TransactionConfiguration(transactionManager = "txManagerTest")
public class EmailServiceTest {
@Autowired
private EmailDao emailDao;
@Test
//@Rollback(false)
public void sendSignedEmailTest() throws Exception {
System.out.println("-------------------------");
System.out.println("sendSignedEmail()");
System.out.println("-------------------------");
String body = "Hello, I'm evil!";
EmailParams params = new EmailParams();
params.setIsCourt(true);
params.setBody(body);
params.setFileName("test.eml");
params.setSaveToFile(false);
params.setSignMessage(false);
params.setFromAddress("xxxx@seznam.cz");
params.setToAddresses("yyyyy@gmail.com");
//params.setMailPriority(5);
//params.setCcs("zzzzz@seznam.cz");
params.setSubject("test");
params.setUserName("aaa");
List<Long> debtIds = new ArrayList<>();
debtIds.add(123018L);
//debtIds.add(184788L);
//debtIds.add(185864L);
params.setDebtIds(debtIds);
DebtEvent event = new DebtEvent();
event.setEventTypeId(5);
event.setStatusTypeId(50);
event.setDescription("description");
event.setEventText("event text");
event.setEventClientText("event client text");
params.setSaveDebtEvent(false);
params.setDebtEventTemplate(event);
boolean ff = emailDao.sendEmail(params);
System.out.println(ff);
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(位置={“classpath:/applicationContext.xml”})
@交易的
@TransactionConfiguration(transactionManager=“txManagerTest”)
公共类EmailServiceTest{
@自动连线
私有EmailDao EmailDao;
@试验
//@回滚(false)
public void sendSignedEmailTest()引发异常{
System.out.println(“---------------------------”);
System.out.println(“sendSignedEmail()”);
System.out.println(“---------------------------”);
String body=“你好,我是邪恶的!”;
EmailParams params=新的EmailParams();
参数setIsCourt(真);
参数立根体(体);
参数setFileName(“test.eml”);
参数setSaveToFile(假);
参数setSignMessage(假);
参数setFromAddress(“xxxx@seznam.cz");
参数设置为地址(“yyyyy@gmail.com");
//参数setMailPriority(5);
//参数setCcs(“zzzzz@seznam.cz");
参数设置主体(“测试”);
参数设置用户名(“aaa”);
List debtIds=new ArrayList();
债务人ID.add(123018L);
//债务人ID.add(184788L);
//债务人ID.add(185864L);
参数setDebtIds(debtIds);
DebtEvent事件=新的DebtEvent();
event.setEventTypeId(5);
事件.setStatusTypeId(50);
事件描述(“描述”);
event.setEventText(“事件文本”);
setEventClientText(“事件客户端文本”);
参数setSaveDebtEvent(假);
参数setDebtEventTemplate(事件);
布尔ff=emailDao.sendmail(参数);
系统输出打印项次(ff);
}
现在,我不想真的向目标地址发送电子邮件。因此,我选择Mockito:
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(locations = {"classpath:/applicationContext.xml"})
@Transactional
@TransactionConfiguration(transactionManager = "txManagerTest")
public class EmailServiceTest {
@Mock
private EmailDao emailDao;
@Test
//@Rollback(false)
public void sendSignedEmailTest() throws Exception {
System.out.println("-------------------------");
System.out.println("sendSignedEmail()");
System.out.println("-------------------------");
String body = "Hello, I'm evil!";
EmailParams params = new EmailParams();
params.setIsCourt(true);
params.setBody(body);
params.setFileName("test.eml");
params.setSaveToFile(false);
params.setSignMessage(false);
params.setFromAddress("xxxx@seznam.cz");
params.setToAddresses("yyyyy@gmail.com");
//params.setMailPriority(5);
//params.setCcs("zzzzz@seznam.cz");
params.setSubject("test");
params.setUserName("aaa");
List<Long> debtIds = new ArrayList<>();
debtIds.add(123018L);
//debtIds.add(184788L);
//debtIds.add(185864L);
params.setDebtIds(debtIds);
DebtEvent event = new DebtEvent();
event.setEventTypeId(5);
event.setStatusTypeId(50);
event.setDescription("description");
event.setEventText("event text");
event.setEventClientText("event client text");
params.setSaveDebtEvent(false);
params.setDebtEventTemplate(event);
Mockito.when(emailDao.sendEmail(params)).thenReturn(Boolean.TRUE);
System.out.println(emailDao.sendEmail(params));
}
@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(位置={“classpath:/applicationContext.xml”})
@交易的
@TransactionConfiguration(transactionManager=“txManagerTest”)
公共类EmailServiceTest{
@嘲弄
私有EmailDao EmailDao;
@试验
//@回滚(false)
public void sendSignedEmailTest()引发异常{
System.out.println(“---------------------------”);
System.out.println(“sendSignedEmail()”);
System.out.println(“---------------------------”);
String body=“你好,我是邪恶的!”;
EmailParams params=新的EmailParams();
参数setIsCourt(真);
参数立根体(体);
参数setFileName(“test.eml”);
参数setSaveToFile(假);
参数setSignMessage(假);
参数setFromAddress(“xxxx@seznam.cz");
参数设置为地址(“yyyyy@gmail.com");
//参数setMailPriority(5);
//参数setCcs(“zzzzz@seznam.cz");
参数设置主体(“测试”);
参数设置用户名(“aaa”);
List debtIds=new ArrayList();
债务人ID.add(123018L);
//债务人ID.add(184788L);
//债务人ID.add(185864L);
参数setDebtIds(debtIds);
DebtEvent事件=新的DebtEvent();
event.setEventTypeId(5);
事件.setStatusTypeId(50);
事件描述(“描述”);
event.setEventText(“事件文本”);
setEventClientText(“事件客户端文本”);
参数setSaveDebtEvent(假);
参数setDebtEventTemplate(事件);
Mockito.when(emailDao.sendmail(params)).thenReturn(Boolean.TRUE);
System.out.println(emailDao.sendmail(params));
}
这段代码总是返回true(没关系),但是sendmail方法没有经过测试
你能帮我解决这个问题吗?我不知道我还必须做什么:-(
谢谢
编辑://
这是EmailDaoImpl类中的sendEmail(EmailParams params):
@Override
public boolean sendEmail(EmailParams params) throws MessagingException, EmailException {
String from = params.getFromAddress();
String to = params.getToAddresses();
String ccs = params.getCcs();
String bccs = params.getBccs();
String subject = params.getSubject();
String body = params.getBody();
boolean signMessage = params.isSignMessage();
boolean saveToFile = params.isSaveToFile();
String fileName = params.getFileName();
boolean isCourt = params.isIsCourt();
List<Long> debtIds = params.getDebtIds();
String userName = params.getUserName();
String priority = (params.getMailPriority() == null || params.getMailPriority() == 0) ? "3" : params.getMailPriority().toString();
String message;
// remove any last semicolon
if (StringUtils.hasText(to)) {
if (to.endsWith(";")) {to = to.substring(0, to.length()-1);}
if (to.startsWith(";")) {to = to.substring(1, to.length());}
}
if (StringUtils.hasText(bccs)) {
if (bccs.endsWith(";")) {bccs = bccs.substring(0, bccs.length()-1);}
if (bccs.startsWith(";")) {bccs = bccs.substring(1, bccs.length());}
}
if (StringUtils.hasText(ccs)) {
if (ccs.endsWith(";")) {ccs = ccs.substring(0, ccs.length()-1);}
if (ccs.startsWith(";")) {ccs = ccs.substring(1, ccs.length());}
}
// addresses checking
if (StringUtils.hasText(to)) {
to = this.checkEmailAddress(to);
}
else {
message = messageSource.getMessage("email.NoRecipientAddress.message", null, LocaleContextHolder.getLocale());
throw new EmailException(message);
}
if (StringUtils.hasText(bccs)) {
bccs = this.checkEmailAddress(bccs);
}
if (StringUtils.hasText(ccs)) {
ccs = this.checkEmailAddress(ccs);
}
// unless priority is set correctly, the end
if (!priority.matches("[135]")) {
message = messageSource.getMessage("email.InvalidPriorityType.message", null, LocaleContextHolder.getLocale());
throw new EmailException(message);
}
byte[] bytes = null;
// I get a template events
DebtEvent debtEventTemplate = params.getDebtEventTemplate();
// if to store the event
if (params.isSaveDebtEvent()) {
// If the template is not defined, then the end
if (debtEventTemplate == null) {
message = messageSource.getMessage("email.InvalidDebtEventTemplate.message", null, LocaleContextHolder.getLocale());
throw new EmailException(message);
}
// if the event does not have date, complementing the current date
if (debtEventTemplate.getEventDate() == null) debtEventTemplate.setEventDate(Calendar.getInstance());
// specify type of storage
debtEventTemplate.setRepositoryId((isCourt) ? 2 : 1);
}
// create a collection of the SMTP server settings
Properties props = System.getProperties();
props.put("mail.smtp.host", mailHost);
props.put("mail.smtp.port", mailPort);
props.put("mail.transport.protocol", mailProtocol);
props.put("mail.smtp.auth", mailAuth);
props.put("mail.smtps.debug", mailDebug);
// create email session
Session session = Session.getDefaultInstance(props, null);
// based on session I create the unsigned MimeMessage and configure it
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setText(body);
mimeMessage.setFrom(new InternetAddress(from));
mimeMessage.setRecipients(Message.RecipientType.TO, this.stringToEmailAddresses(to));
mimeMessage.setRecipients(Message.RecipientType.CC, this.stringToEmailAddresses(ccs));
mimeMessage.setRecipients(Message.RecipientType.BCC, this.stringToEmailAddresses(bccs));
mimeMessage.setSubject(subject);
mimeMessage.setSentDate(new Date());
mimeMessage.setHeader("X-Priority", priority);
mimeMessage.saveChanges();
// setup priority
switch (priority) {
case "1":
mimeMessage.setHeader("X-Priority", priority);
mimeMessage.setHeader("X-MSMail-Priority", "High");
mimeMessage.setHeader("Importance", "High");
break;
case "3":
mimeMessage.setHeader("X-Priority", priority);
mimeMessage.setHeader("X-MSMail-Priority", "Normal");
mimeMessage.setHeader("Importance", "Normal");
break;
case "5":
mimeMessage.setHeader("X-Priority", priority);
mimeMessage.setHeader("X-MSMail-Priority", "Low");
mimeMessage.setHeader("Importance", "Low");
break;
default:
mimeMessage.setHeader("X-Priority", priority);
mimeMessage.setHeader("X-MSMail-Priority", "Normal");
mimeMessage.setHeader("Importance", "Normal");
break;
}
// If the email sign
if (signMessage) {
// create and configure MailcapCommandMap and MIME types used for SMIME
final MailcapCommandMap mailcap = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mailcap.addMailcap("application/pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_signature");
mailcap.addMailcap("application/pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_mime");
mailcap.addMailcap("application/x-pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_signature");
mailcap.addMailcap("application/x-pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_mime");
mailcap.addMailcap("multipart/signed;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.multipart_signed");
CommandMap.setDefaultCommandMap(mailcap);
// sign message
MimeMultipart mm = null;
try {
mm = signMessage(mimeMessage);
} catch (KeyStoreException ex) {
Logger.getLogger(EmailDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(EmailDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(EmailDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (CertificateException ex) {
Logger.getLogger(EmailDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnrecoverableKeyException ex) {
Logger.getLogger(EmailDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidAlgorithmParameterException ex) {
Logger.getLogger(EmailDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchProviderException ex) {
Logger.getLogger(EmailDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (CertStoreException ex) {
Logger.getLogger(EmailDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (SMIMEException ex) {
Logger.getLogger(EmailDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex) {
Logger.getLogger(EmailDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
}
// Copied headers from the original unsigned messages to new message
final Enumeration headers = mimeMessage.getAllHeaderLines();
// create a new envelope
mimeMessage = new MimeMessage(session);
while (headers.hasMoreElements()){
mimeMessage.addHeaderLine((String)headers.nextElement());
}
// I put the signed content
mimeMessage.setContent(mm);
mimeMessage.saveChanges();
}
// If email have to save to file
if (saveToFile) {
// too many lines of code
}
// send email
Transport.send(mimeMessage);
// return true
return true;
}
@覆盖
公共布尔sendEmail(EmailParams params)抛出MessaginException,EmailException{
字符串from=params.getFromAddress();
字符串to=params.getToAddresses();
字符串ccs=params.getCcs();
字符串bccs=params.getBccs();
字符串subject=params.getSubject();
String body=params.getBody();
布尔signMessage=params.isSignMessage();
布尔saveToFile=params.isSaveToFile();
字符串fileName=params.getFileName();
布尔值isCourt=params.isIsCourt();
List debtIds=params.getDebtIds();
字符串userName=params.getUserName();
字符串优先级=(params.getMailPriority()==null | | params.getMailPriority()==0)?“3”:params.getMailPriority().toString();
字符串消息;
//删除最后的分号
if(StringUtils.hasText(to)){
if(to.endsWith(“;”){to=to.substring(0,to.length()-1);}
if(to.startsWith(“;”){to=to.substring(1,to.length());}
}
if(StringUtils.hasText(密件抄送)){
if(bccs.endsWith(“;”){bccs=bccs.substring(0,bccs.length()-1);}
if(bccs.startsWith(“;”){bccs=bccs.substring(1,bccs.length());}
}
if(StringUtils.hasText(ccs)){
if(ccs.endsWith(“;”){ccs=ccs.substring(0,ccs.length()-1);}
if(ccs.startsWith(“;”){ccs=ccs.substring(1,ccs.length());}
}
//地址检查
if(StringUtils.hasText(to)){
to=此。检查电子邮件地址(to);
}
否则{
message=messageSource.getMessage(“email.NoRecipientAddress.message”,null,LocaleContextHolder.getLocale());
抛出新的EmailException(消息);