2

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(); } } 
1
  • Can you give me a line number? Commented Nov 8, 2013 at 16:26

1 Answer 1

4

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) } } 
Sign up to request clarification or add additional context in comments.

2 Comments

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.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.
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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.