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.
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();
}
}
Here is the class under test:
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();
}
}
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
orMockito.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.
Note: the following might not compile, but hopefully you'll get the idea.