2016-07-23 13 views
1

Ich schicke eine E-Mail an den Benutzer bei der Einreichung des Formulars. Ich habe Probleme beim Testen. Ich teste sendConfirmationEmailForSubmission, und form submission. Aber beim Testen der Formularübermittlung sendet es jedes Mal Mail. Und ich habe viele Kombinationen zum Testen der Formularübergabe. Ich verschwende meine Quote an E-Mails, indem ich während des Einreichversuchs E-Mails sende, während ich die sendEmail-Funktion separat teste. Kann mir bitte jemand dabei helfen.Wie kann ich einige Tests schreiben, so dass sie beim Testen keine E-Mails senden?

SubmitAction sendet das Formular und sendet E-Mail. Um E-Mails zu senden, wählen Sie Anrufe sendConfirmationEmailForSubmission().

Ich denke, anstelle der obigen Funktion sollte ich es wie diese verwenden und übergeben Sie UserId = null beim Testen Form Submission?

public void sendConfirmationEmailForSubmission(String userId) 
    throws EntityDoesNotExistException { 

if (userId != null) { 
    EmailsLogic.sendConfirmationEmailForSubmission(userId); 
    } 
} 
+0

* anstelle der obigen Funktion sollte ich es wie diese verwenden und 'userId = null' übergeben, während ich die Formularübergabe teste? * In diesem Fall wird ** ** ** beim Testen E-Mails senden. Was ich dachte, du wolltest nicht. Möchten Sie die E-Mail senden oder nicht? –

+0

@ tarun14110 Zusammenfassung der E-Mail-sendenden Funktionalität hinter seinem eigenen Dienst (SRP) und dann diesen Dienst für Ihre Tests vortäuschen. Mithilfe der Abstraktion können Sie zwischen verschiedenen Implementierungen wechseln. In der Produktion können Sie dann die Produktionsimplementierung verwenden. – Nkosi

+0

@EliottFrisch Sorry, das war meine Schuld. aktualisiert. Ich möchte während der Einreichung keine E-Mails senden. – tarun14110

Antwort

0

Es scheint, die Methode, die Sie für das Senden von E-Mails haben (EmailsLogic.sendConfirmationEmailForSubmission) ist statisch.

Sie können eine Bibliothek wie PowerMock verwenden, um den E-Mail-Dienst nachzuahmen. Und bei der Scheinmethode können Sie einfach "E-Mail gesendet" drucken, ohne tatsächlich eine E-Mail zu senden und den Rest Ihres Codes zu testen.

Dies ist ein guter Artikel über PowerMock mit statischen Methoden testen: https://blog.codecentric.de/en/2011/11/testing-and-mocking-of-static-methods-in-java/

+0

Die statische Methode sollte nicht in Java missbraucht werden. Anstatt Tricks zu verwenden, mit denen ein nicht testbarer Code auf eine trickreiche Weise testbar gemacht werden kann, wäre es interessanter, den Code auf natürliche Weise testbar zu machen. Ein Logikprozess in einer statischen Methode ist kein gutes Muster. – davidxxx

+0

Wenn Sie etwas Zeit haben, überprüfen Sie den Artikel, den ich verlinkt habe, was gegen Ihre Meinung spricht. – Bajal

+0

Ich lese. Ich weiß und ich habe PowerMock lange benutzt. Heute benutze ich es nicht mehr. In Ihrem Artikel ist das Argument des Autors über Testbarkeit, aber die Verwendung von statischen Methoden anstelle von Instanzmethoden verursacht Probleme nicht nur für die Testbarkeit. Alle OOP Konzeption sind mit statischen Methode verloren. Instanz auch bei einer Methode übergeben. Sie können lesen: http://martinfowler.com/articles/injection.html (König) http://programmers.stackexchange.com/questions/98083/cant-i-just-use-all-static- Methoden https://dzone.com/articles/why-static-bad-and-how-avoid – davidxxx

0

Statische Methode sollte nicht in Java missbraucht werden. Um Ihre Bedürfnisse zu erfüllen, schlage ich Ihnen vor, OOP zu nutzen: den Polymorphismus. Das macht Ihr Design flexibler und testbarer.

So könnten Sie Ihre statische Methode EmailsLogic.sendConfirmationEmailForSubmission in einer Instanzmethode ändern. Anstatt sich auf statische Methoden zu verlassen, könnten Sie dann Objekte der Klassenhierarchie E-MailsLogic verwenden. Sie könnten zwei Implementierungen von EmailsLogic erstellen. EmailsLogic mit dem E-Mail senden und eine andere Klasse: StubbedEmailsLogic, die EmailsLogic Klasse erweitert, aber die E-Mail-Sendemethode sendConfirmationEmailForSubmission() überschreibt, indem Sie keine E-Mails senden.
Verwenden Sie jetzt in Ihren Tests eine Instanz von StubbedEmailsLogic, die den E-Mail-Versand fälscht, indem Sie diese Instanz der SubmitAction-Klasse zuweisen.
Wichtig: Ihre Aktionsklasse sollte den Basistyp EmailsLogic erwarten, um den Wechsel zu einer oder anderen Implementierung zu ermöglichen.