NullPointerException in mockito unit test

22,150

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)
    }
}
Share:
22,150
Awesome_girl
Author by

Awesome_girl

Computer Engineer from University of Waterloo

Updated on November 09, 2020

Comments

  • Awesome_girl
    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
    Awesome_girl over 10 years
    I 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.excep‌​tions.base.MockitoEx‌​ception 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
    andyb over 10 years
    I 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 a ValidationException? From the code you have in the question, the answer is no