Wie man eine javax.mail.Session vortäuscht

8

Ich muss ein javax.mail.Session-Objekt in meinen Unit-Tests vortäuschen. Die Klasse javax.mail.Session wird als final gekennzeichnet, sodass Mockito keinen Mock erstellen kann. Hat jemand eine Idee, wie man das beheben kann?

Bearbeiten: Mein Test ist ein Arquillian-Test und hat bereits eine Annotation @RunWith (Arquillian.class). Daher ist powermock keine Option.

    
martin 21.11.2011, 14:33
quelle

9 Antworten

9

Sie können Ihren Code ein wenig umgestalten. Im Buch "Working with Legacy Code" von Martin Fowler beschreibt er eine Technik, um die externe API (Think Java Mail API) von Ihrem eigenen Anwendungscode zu trennen. Die Technik heißt "Wrap and Skin" und ist ziemlich einfach.

Was Sie tun sollten, ist einfach:

  1. Erstellen Sie eine Schnittstelle MySession (die Ihre eigenen Sachen ist), indem Sie Methoden aus der Klasse javax.mail.Session extrahieren.
  2. Implementieren Sie diese Schnittstelle, indem Sie eine konkrete Klasse erstellen (die der ursprünglichen javax.mail.Session ähnelt)
  3. Bei jeder Methode DELEGIEREN Sie den Aufruf der äquivalenten javax.mail.Session-Methode
  4. Erstelle deine Mock-Klasse, die MySession implementiert: -)
  5. Aktualisieren Sie Ihren Produktionscode, um MySession anstelle von javax.mail.Session
  6. zu verwenden

Viel Spaß beim Testen!

EDIT: Siehe auch diesen Blogbeitrag: Ссылка

    
nowaq 21.11.2011 15:36
quelle
6

Benutze PowerMockito , um dich zu verspotten.

%Vor%     
Boris Pavlović 21.11.2011 14:36
quelle
4

Sie können das Projekt Mock JavaMail verwenden. Ich fand es zuerst von Kohsuke Kawaguchi . Alan Franzoni hat auch einen Grund dafür in seinem Blog.

Wenn Sie diese JAR-Datei in Ihren Klassenpfad einfügen, ersetzt sie das Senden von E-Mails an Speicherpostfächer, die sofort überprüft werden können. Es ist super einfach zu bedienen.

Das Hinzufügen zu Ihrem Klassenpfad ist zugegebenermaßen eine ziemlich schwer zu handhabende Art, etwas zu verspotten, aber Sie möchten in Ihren automatisierten Tests sowieso selten echte E-Mails senden.

    
jhericks 21.11.2011 16:44
quelle
1

Wenn Sie eine letzte Klasse verspotten möchten, können Sie den JDave-Finalisierer verwenden, den Sie hier finden: Ссылка

Er verwendet CGLib, um den Bytecode dynamisch zu ändern, wenn die JVM geladen wird, um die Klasse als nicht endgültige Klasse zu transformieren.

Diese Bibliothek kann dann mit JMock2 ( Ссылка ) verwendet werden, um Ihre Tests durchzuführen, soweit ich weiß , Mockito ist nicht mit JDave kompatibel.

    
DarkRift 21.11.2011 14:44
quelle
1

Benutze Java 8 Funktionen!

%Vor%

Dann wird Ihr Testcode ungefähr wie folgt aussehen:

%Vor%

Um einen Integrationstest zu erstellen, verbinden Sie die reale Sitzung und den Transport.

%Vor%     
Daniel Hinojosa 28.03.2015 19:01
quelle
0

Sehen Sie in den PowerMock-Dokumenten nach läuft unter JUnit 3 , da es keine Runner hatte oder ein Bytecode-Manipulationstool verwendet.

    
Dave Newton 21.11.2011 14:46
quelle
0

Wenn Sie Spring in Ihr Projekt einbinden können, können Sie JavaMailSender verwenden und sich darüber lustig machen. Ich weiß nicht, wie kompliziert deine Anforderungen sind.

%Vor%     
Brad 24.11.2011 17:08
quelle
0

Das ist eine ziemlich alte Frage, aber Sie könnten Ihren eigenen Transport immer mit JavaMail-API . Mit Ihrem eigenen Transport könnten Sie es einfach nach dieser Dokumentation konfigurieren . Ein Vorteil dieses Ansatzes ist, dass Sie mit diesen Nachrichten alles tun können, was Sie wollen. Vielleicht würden Sie sie in einem Hash / Set speichern, das Sie dann sicherstellen könnten, dass sie tatsächlich in Ihren Komponententests gesendet wurden. Auf diese Weise müssen Sie das endgültige Objekt nicht verspotten, sondern nur Ihr eigenes implementieren.

    
Lucas 10.07.2012 20:03
quelle
0

Ich benutze die mock-javamail Bibliothek. Es ersetzt nur die Javamail-Ursprungsimplementierung im Klassenpfad. Sie können E-Mails normal senden, es wird nur an In-Memory-Mailbox, kein echtes Postfach gesendet.

Schließlich können Sie das Objekt MailBox verwenden, um alles zu bestätigen, das Sie überprüfen möchten.

    
qrtt1 02.05.2013 06:18
quelle

Tags und Links