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.
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:
Viel Spaß beim Testen!
EDIT: Siehe auch diesen Blogbeitrag: Ссылка
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.
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.
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%Sehen Sie in den PowerMock-Dokumenten nach läuft unter JUnit 3 , da es keine Runner hatte oder ein Bytecode-Manipulationstool verwendet.
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.
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.