2015-09-22 1 views
0

je suit @Service classe qui est utilisée pour recevoir des commentaires, vérifiez les détails sur la base d'une liste de critères. S'il est vérifié, envoyez-le à son destinataire.Je ne sais pas comment tester une classe email a reçu des commentaires

Je me bats pour écrire un test pour cette classe. Je sais qu'il n'est pas nécessaire de tester les services externes en utilisant Junit. Comme l'envoi d'e-mail dans mon cas, mais,

  • Quelle est la meilleure approche pour tester cette classe?
  • Dois-je même le tester?
    • Sinon pourquoi?
    • Si oui comment compléter le cas de test?

code

@Service 
public class FeedbackServiceImpl implements FeedbackService { 

    @Autowired 
    private MailSender mailSender; 

    @Override 
    public boolean sendIt(Feedback feedback) 
      throws MailAuthenticationException, CustomException { 
     validateEmail(feedback.getEmail()); 
     try { 
      SimpleMailMessage message = new SimpleMailMessage(); 
      switch (feedback.getRecipient()) { 
      case 1: 
       message.setTo("[email protected]"); 
       break; 
      case 2: 
       message.setTo("[email protected]"); 
       break; 
      default: 
       message.setTo("[email protected]"); 
       break; 
      } 

      message.setCc(feedback.getEmail()); 
      message.setSubject(subject); 
      message.setText(msg); 
      mailSender.send(message); 

     } catch (MailSendException send) { 
      System.err.println(send.getFailedMessages() + " " 
        + send.getMessage() + " " + feedback); 
     } 
     return true; 

    } 

    private void validateEmail(String sender) throws CustomException { 
     //make sure provided email is valid 
     //this method does verification process against different criteria 

    } 

} 

JUnit

@Test 
public void shouldReturnFalseForInvalidFeedbackEmail(){ 
    MailSender mailSender = Mockito.mock(MailSender.class); 
    FeedbackService feedbackSrv = new FeedbackServiceImpl(); 
    boolean result = feedbackSrv.sendIt(feedback); 
    assertTrue(result); 
} 
+0

Je voudrais utiliser un faux et vérifier que 1/le message est correctement envoyé (c'est-à-dire si le destinataire est 1, envoyé à jack etc.) 2/MailSendException est correctement géré 3/make 'validateEmail'' protected' et le tester. NB: il est étrange que la méthode 'sendIt' retourne toujours vrai. –

+0

@Rc ​​Si quelque chose ne va pas, il lève une exception donc, il retourne juste vrai. Connaissez-vous d'autres approches? Comment tester MailSendException? cette exception n'est transmise que si MailSender ne peut pas envoyer l'e-mail. – Jack

+0

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html pourrait être intéressant à lire (il y a un 'doThrow()') –

Répondre

0

validateEmail qui peut être testé directement en utilisant une visibilité privée de l'emballage. case et catch peut être testé en se moquant mailSender (et si vraiment nécessaire également Feedback).

et c'est ce que vous pouvez tester unitaire. tout le reste est un test d'intégration. Si vous faites une application pour envoyer des e-mails avec de nombreuses configurations différentes en utilisant des paramètres très différents, je le testerais. Si vous n'utilisez qu'une seule configuration et un seul serveur SMTP et qu'il est peu probable qu'il soit modifié ultérieurement, peut-être que cela ne vaut pas la peine de mettre en place des tests automatiques de mailing

+0

J'ai essayé de tester la méthode privée en vain, la question est ici, http://stackoverflow.com/questions/32709784/cannot-test-a-class-that-return-a-customexception – Jack

+0

ne pas tester la méthode ** private **. changez-le à ** paquet privé ** – piotrek

+0

Je voudrais en savoir plus sur la réflexion, c'est pourquoi je suis en train de tester la méthode privée. Aussi comment tester le cas et attraper? voulez-vous me donner un exemple? – Jack