mockito 单元测试中的 NullPointerException [英] NullPointerException in mockito unit test
问题描述
这是我要进行单元测试的 SendEmail
类.我在下面显示的行上收到 NullPointerException,但我不知道为什么.
Here is my SendEmail
class that I am trying to unit test. I am getting a NullPointerException on the line shown below, but I don't know why.
另外,我是否正确组织了代码?我不知道我是否正确使用了 mockito.
Also, am I organizing the code properly? I don't exactly know if I am using mockito correctly.
public class StatsTest extends AbstractTestCase {
@Mock
MultiPartEmail MultiPartEmailMock;
StatsTest statsTestObj;
SendEmail mockedEmail;
@Before
public void setUp() throws Throwable {
super.setUp();
MockitoAnnotations.initMocks(this);
}
@Test(expected = ValidationException.class)
public void testSendEmail() throws EmailException, IOException {
MultiPartEmail multiPartEmailMock;
SendEmail mockedEmail = Mockito.mock(SendEmail.class);
Mockito.when((mockedEmail.getHtmlEmail()).send())
.thenThrow(new ValidationException("Could not send the Email."));
^^ the line above is where the null pointer error is
mockedEmail.sendEmail();
}
}
这是被测试的类:
public class SendEmail {
private StringBuilder emailBody;
private String senderEmail;
private ArrayList<String> receiversEmails;
private String emailSubject;
private String hostName;
private MultiPartEmail htmlEmail;
public SendEmail(StringBuilder emailBody, String senderEmail, ArrayList<String>
receiversEmails, String emailSubject, String hostName, MultiPartEmail htmlEmail) {
this.setEmailBody(emailBody);
this.setSenderEmail(senderEmail);
this.setReceiversEmails(receiversEmails);
this.setEmailSubject(emailSubject);
this.setHostName(hostName);
this.setHtmlEmail(htmlEmail);
}
public void sendEmail()throws IOException, EmailException{
htmlEmail.setHostName(getHostName());
htmlEmail.addTo(getReceiversEmails().get(0));
for(int i=0; i<getReceiversEmails().size(); i++){
htmlEmail.addCc(getReceiversEmails().get(i));
}
htmlEmail.setFrom(getSenderEmail());
htmlEmail.setSubject(getEmailSubject());
htmlEmail.setMsg((getEmailBody()).toString());
htmlEmail.send();
}
}
推荐答案
我认为您对需要测试和模拟的内容有些困惑.Mockito 提供了不同的方式来创建模拟对象,例如:@Mock
或 Mockito.mock()
.还有不同的方法可以将这些模拟对象注入到被测类中,以便对该类的方法进行单元测试.
I think you are a bit confused on what you need to be testing and mocking. Mockito offers different ways to create mock object, for example: @Mock
or Mockito.mock()
. There are also different ways to inject those mock objects into the class under test in order to unit test methods on that class.
如果没有异常或其他类的所有细节,这将不是一个完整的答案,但我希望它有助于澄清一些概念.
Without all the details of the exception or other classes, this will not be a complete answer, but I hope it helps clear up some of the concepts.
注意:以下内容可能无法编译,但希望您能理解.
public class StatsTest extends AbstractTestCase {
@Mock MultiPartEmail mockMultiPartEmail; // this mock will be used in the instantiaion of the class under test
SendEmail sendEmail; // renamed as this is not a mock, it is the class under test
// define some things we can make assertions against (probably in some other tests...)
private static final StringBuilder BODY = new StringBuilder("body");
private static final String SENDER = "sender@foo.com";
private static final Collection<String> RECIPIENTS = Arrays.asList("recepient@foo.com")
private static final String SUBJECT = "subject";
private static final String HOSTNAME = "hostname";
@Before
public void setUp() throws Throwable {
super.setUp();
MockitoAnnotations.initMocks(this); // will instantiate "mockMultiPartEmail"
// instantiate our class under test
sendEmail = new SendEmail(BODY, SENDER, RECIPIENTS, SUBJECT, HOSTNAME, mockMultiPartEmail);
}
@Test(expected = ValidationException.class)
public void testSendEmail() throws EmailException, IOException {
// given some condition
Mockito.when(mockMultiPartEmail.send()).thenThrow(new ValidationException("Could not send the Email."));
// when the method under test is called
sendEmail.sendEmail();
// then the exception will be thrown (and you have correctly expected this on the @Test annotation)
}
}
这篇关于mockito 单元测试中的 NullPointerException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!