2013-11-08 7 views
1

Вот мой класс SendEmail, который я пытаюсь выполнить модульным тестом. Я получаю исключение NullPointerException в строке, показанной ниже, но я не знаю почему.NullPointerException в модульном модульном тесте

Кроме того, я правильно организовываю код? Я точно не знаю, правильно ли использую mockito.

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(); 
    } 
} 
+0

Можете ли вы дать мне номер строки? –

ответ

3

Я думаю, вы немного запутался, что вам нужно испытывать и насмешливый. Mockito предлагает различные способы создания макетного объекта, например: @Mock или Mockito.mock(). Существуют также различные способы: ввести те из них в класс , который находится под тестированием, для того, чтобы выполнить единичные методы тестирования этого класса.

Без всякой информации об исключении или других классах это не будет полным ответом, но я надеюсь, что это поможет прояснить некоторые концепции.

Примечание: следующее может не компилироваться, но, надеюсь, вы получите эту идею.

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) 
    } 
} 
+0

Я запустил его, он остановился на линии: Mockito.when (mockMultiPartEmail.send.()). ThenThrow (new ValidationException («Не удалось отправить электронную почту»)); Исключение: java.lang.Exception: Неожиданное исключение, как ожидается butwas

+0

Я не могу больше помочь, не видя всего вашего кода! Мой _example_ выше был закодирован без какого-либо реального знания вашей полной кодовой базы. Ошибка говорит, что «mockito ожидал исключения« ValidationException », но на самом деле получил что-то еще. С http://stackoverflow.com/questions/3762047/throw-checked-exceptions-from-mocks-with-mockito это выглядит быть вызванным вашим тестом, бросающим что-то, что «недействительно, чтобы быть брошенным этим конкретным вызовом метода». Действительно ли ваш код бросает «ValidationException»? Из кода, который у вас есть в вопросе, ответ: ** нет ** – andyb

+0

супер очень хорошее объяснение – user2045474

Смежные вопросы