NullPointerException in mockito unit test
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.
Note: the following might not compile, but hopefully you'll get the idea.
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 = "[email protected]";
private static final Collection<String> RECIPIENTS = Arrays.asList("[email protected]")
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)
}
}
Comments
-
Awesome_girl over 3 years
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(); } }
-
Awesome_girl over 10 yearsI ran it, it stops on line: Mockito.when(mockMultiPartEmail.send.()).thenThrow(new ValidationException("Could not send the Email")); The exception is: java.lang.Exception: Unexpected exception, expected <javax.xml.bind.ValidationException>butwas<org.mockito.exceptions.base.MockitoException caused by: org.mockito.exceptions.base.MockitoException: Checked exception is invalid for the method! Invalid: java.xml.bind.ValidationException: Could not send the Email.
-
andyb over 10 yearsI cannot help much more without seeing all of your code! My example above was coded without any real knowledge of your full codebase. The error is saying that "mockito was expecting a
ValidationException
exception, but actually got something else. From stackoverflow.com/questions/3762047/… this looks to be caused by your test throwing something that is "not valid to be thrown by that particular method call". Does your code actually throw aValidationException
? From the code you have in the question, the answer is no