Unit testing 当尝试使用Mockito对发送电子邮件进行单元测试时,我在函数中创建了一个multipartemail对象,但是测试失败了,为什么?
这是我的单元测试代码Unit testing 当尝试使用Mockito对发送电子邮件进行单元测试时,我在函数中创建了一个multipartemail对象,但是测试失败了,为什么?,unit-testing,mockito,Unit Testing,Mockito,这是我的单元测试代码 public class StatsTest extends AbstractTestCase { @Mock //EmailInfo mockMetricsEmail = Mockito.mock(EmailInfo.class); //EmailSenderImpl mockEmailSenderImpl = Mockito.mock(EmailSenderImpl.class); private MultiPartEmail mockMultiPartEmail
public class StatsTest extends AbstractTestCase {
@Mock
//EmailInfo mockMetricsEmail = Mockito.mock(EmailInfo.class);
//EmailSenderImpl mockEmailSenderImpl = Mockito.mock(EmailSenderImpl.class);
private MultiPartEmail mockMultiPartEmail = Mockito.mock(HtmlEmail.class);
private static final String testEmailBody = "This is the test email body.";
private static final String testSender = "seemakur@amazon.com";
private static final String testRecipient = ("seemakur@amazon.com");
private static final String testEmailSubject = "subject";
private static final String testHostName = "seemakur.desktop.amazon.com";
private static final MultiPartEmail testHtmlEmail = new HtmlEmail();
EmailSenderImpl emailSenderImplObj = new EmailSenderImpl();
EmailInfo emailInfoObj = new EmailInfo(testEmailBody, testSender, testRecipient, testEmailSubject, testHostName, testHtmlEmail);
@Before
public void setUp() throws Throwable {
super.setUp();
MockitoAnnotations.initMocks(this); // will instantiate "mockMultiPartEmail"
// instantiate our class under test
}
@Test(expected = EmailException.class)
public void testSendEmail() throws EmailException, IOException {
MultiPartEmail testMultiPartEmail = Mockito.spy(new HtmlEmail());
Mockito.doReturn(mockMultiPartEmail).when(emailInfoObj).getMultiPartEmail(); //stub(spy.getMultiPartEmail()).toReturn(mockMultiPartEmail);
Mockito.when(mockMultiPartEmail.send()).thenThrow(new EmailException("Failed on multipartEmail.send(), hence could not send the email."));
// when the method under test is called
try {
//testEmailSenderImplObj.sendHtmlTableAsEmail(testMetricsEmail);
emailSenderImplObj.sendHtmlTableAsEmail(emailInfoObj); //inject mock & invoke what to test
fail("Expecting EmailException");
}catch(EmailException e){
e.printStackTrace();
}
Mockito.verify(mockMultiPartEmail).send();Mockito.doReturn(mockMultiPartEmail).when(emailInfoObj).getMultiPartEmail(); //stub(spy.getMultiPartEmail()).toReturn(mockMultiPartEmail);
}
}
我有三个与此电子邮件功能相关的类:
下面首先是emailInfo数据对象
@Data
public class EmailInfo {
private String emailBody;
private String senderEmail;
private String receiversEmails;
private String emailSubject;
private String hostName;
private MultiPartEmail multiPartEmail;
public EmailInfo(String emailBody, String senderEmail, String receiversEmails, String emailSubject, String hostName, MultiPartEmail multiPartEmail) {
this.setEmailBody(emailBody);
this.setSenderEmail(senderEmail);
this.setReceiversEmails(receiversEmails);
this.setEmailSubject(emailSubject);
this.setHostName(hostName);
this.setMultiPartEmail(multiPartEmail);
}
public String getSenderEmail() {
return senderEmail;
}
public void setSenderEmail(String senderEmail) {
this.senderEmail = senderEmail;
}
public String getEmailBody() {
return emailBody;
}
public void setEmailBody(String emailBody) {
this.emailBody = emailBody;
}
public String getReceiversEmails() {
return receiversEmails;
}
public void setReceiversEmails(String receiversEmails2) {
this.receiversEmails = receiversEmails2;
}
public String getEmailSubject() {
return emailSubject;
}
public void setEmailSubject(String emailSubject) {
this.emailSubject = emailSubject;
}
public String getHostName() {
return hostName;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public MultiPartEmail getMultiPartEmail() {
return multiPartEmail;
}
public void setMultiPartEmail(MultiPartEmail multiPartEmail) {
this.multiPartEmail = multiPartEmail;
}
}
第二类:EmailSenderImpl.java
public class EmailSenderImpl implements EmailSender{
// public MultiPartEmail getEmail(){
// return multiPartEmail;
// }
//
// public void setEmail(MultiPartEmail multiPartEmail){
// this.multiPartEmail = multiPartEmail;
// }
public void sendHtmlTableAsEmail(EmailInfo emailInfo)throws IOException, EmailException{
MultiPartEmail multiPartEmail = new HtmlEmail();
multiPartEmail.setHostName(emailInfo.getHostName());
multiPartEmail.addTo(emailInfo.getReceiversEmails());
multiPartEmail.setFrom(emailInfo.getSenderEmail());
multiPartEmail.setSubject(emailInfo.getEmailSubject());
multiPartEmail.setMsg((emailInfo.getEmailBody()).toString());
multiPartEmail.send();
}
}
最后是EMailSender.java接口
public interface EmailSender{
public abstract void sendHtmlTableAsEmail(EmailInfo emailInfo)throws IOException, EmailException;
}
对于一个简单的函数,我之所以有这么多的类,是因为我不能使用静态方法,我必须将“业务逻辑”与“功能逻辑”分开。我需要有接口,这是必要的。如果有更好的方法来组织这个,请让我知道
现在,当我运行单元测试时,它在以下行失败:“Mockito.doReturn(mockMultiPartEmail).when(emailInfoObj.getMultiPartEmail();//stub(spy.getMultiPartEmail()).toreern(mockMultiPartEmail);
");"
错误显示为:org.mockito.exceptions.misusing.NotAMockException在原始代码中,您的问题在于这一行
Mockito.doReturn(mockMultiPartEmail).when(emailInfoObj).getMultiPartEmail();
EmailInfo emailInfoObj = new EmailInfo(testEmailBody, testSender, testRecipient, testEmailSubject, testHostName, testHtmlEmail);
您正试图用这一行来存根创建的行为
Mockito.doReturn(mockMultiPartEmail).when(emailInfoObj).getMultiPartEmail();
EmailInfo emailInfoObj = new EmailInfo(testEmailBody, testSender, testRecipient, testEmailSubject, testHostName, testHtmlEmail);
但这不是一个模拟或间谍。Mockito只允许你存根模拟和间谍的行为,而不仅仅是任意对象
我不知道在后续更新之后您是否仍然有这个问题,因为不可能读取嵌入在注释中的代码。
将EMAILIN FOOBO作为模拟对象,请考虑发布完整的SttTraceNeXT TimeMeaEngIn是我写的类,所以我不必嘲笑它吗?我只需要模拟多部分电子邮件,对吗?这里是完整的堆栈跟踪:java.lang.Exception:Unexpected Exception,应该是org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:31)org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)org.junit.runners.ParentRunner.runner.runnever(ParentRunner.java:263)AT请不要将有关您的问题的其他信息添加为评论,您应该编辑您的问题。请阅读:-如果您想添加行为,即使您自己编写,也必须模拟对象现在失败在这一行:“失败(“预期EmailException”);“OP-你能编辑你的问题,使它有你的实际代码和堆栈跟踪吗?一个我可以直接复制并粘贴到我的IDE上的例子最好。如果我必须阅读你的问题和三个不同的注释来理解你的代码的实际内容,就不可能找到你的代码的问题。