Testen auf gesendete E-Mails - Dumbster und Greenmail fangen gesendete Java-Mails nicht ab
Frage
Ich versuche mich zu integrieren Dummkopf um unseren JavaMail-basierten Notifier für ausgehende E-Mails zu testen.Die E-Mails werden gesendet, aber in meinem Test nimmt Dumbster sie nicht auf.Ich bin mir nicht sicher, ob ich eine zusätzliche Konfiguration benötige, damit dies funktioniert, aber auf der Dumbster-Homepage heißt es, dass automatisch auf E-Mails gewartet wird, die über SMTP an Port 25 gesendet werden.
Dies ist unser Java-Mail-Setup:
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.somewhere.com" />
<property name="port" value="25" />
<property name="username" value="theUserName" />
<property name="password" value="thePassword" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
</props>
</property>
</bean>
Unsere Mailer-Klasse injiziert nur den JavaMailer:
@Component
public class OurMailer {
@Inject
private MailSender mailSender;
public void sendMail(String from, String to, String subject, String msg) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(msg);
mailSender.send(message);
}
Der Test ist ziemlich einfach, wie sie auf ihrer Seite zeigen:
@Inject
private OurMailer ourMailer;
@Test
public void ourMailer_should_send_mail() {
SimpleSmtpServer server = SimpleSmtpServer.start();
ourMailer.sendMail(FROM_EMAIL, TO_EMAIL, SUBJECT, MESSAGE);
server.stop();
Assert.assertTrue(server.getReceivedEmailSize() == 1);
}
Wie gesagt, die Mail wird gesendet, aber die Bestätigung schlägt fehl.
Irgendwelche Ideen?
ÜBRIGENS:Ich habe auch Greenmail ausprobiert, aber mit dem gleichen Ergebnis:
maven etwas anders:
<dependency>
<groupId>com.icegreen</groupId>
<artifactId>greenmail</artifactId>
<version>1.3.1b</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Test
GreenMail greenMail = new GreenMail(); //uses test ports by default
greenMail.start();
// send mail
Assert.assertEquals("subject", greenMail.getReceivedMessages()[0].getSubject());
greenMail.stop();
Lösung
Der Test schlägt fehl, weil in der Konfiguration "Senden Sie die E-Mail an den SMTP-Server" angezeigt wird smtp.somewhere.com
" aber du willst es an die schicken SimpleSmtpServer
welches läuft auf localhost
Verwenden Sie eine Systemeigenschaft für die host
parameter des mailSender
bohne und setze es auf localhost
wenn Sie einen Test ausführen.
Das heißt, ich schlage vor, den Test in zwei Teile zu teilen.Der erste Test sollte nur sicherstellen, dass die Methode mit den richtigen Parametern aufgerufen wird.Auf diese Weise wissen Sie, dass der Code versucht, E-Mails zum richtigen Zeitpunkt zu senden;es macht wenig Sinn, die SMTP-Authentifizierung, Ihren Mailserver, die Mail-Infrastruktur und das Netzwerk in einem Komponententest zu testen - all dies wird von den jeweiligen Herstellern getestet.
Ein zweiter Test sollte nur die Methode testen sendMail()
Methode.Fügen Sie diesen Test in eine Testsuite ein, die manuell ausgeführt werden kann.Was Sie hier wissen möchten, ist, ob Sie das richtig eingerichtet und verwendet haben MailSender
API.Es sei denn, Sie ändern den Code in der sendMail()
methode, Sie müssen diesen Test überhaupt nicht ausführen.
Dies beschleunigt Ihren Komponententest und beseitigt viele unnötige Abhängigkeiten, die dazu führen können, dass der Test fehlschlägt, obwohl Ihr Code ordnungsgemäß funktioniert.
Andere Tipps
Hinweis: Es scheint neuere Versionen von dumbster (nicht verfügbar von der ursprünglichen Quelle verfügbar), die möglicherweise die Hangfehler behoben haben, die Sie aufgeteilt haben:
sourceforge.net/p/dumumster/patches/9 /
https://github.com/rjo1970/dumbster
git-wip-us.apache.org/repos/asf?p=logging-log4j2.git;a=commit;h=B0F7BE4B0666DCA22205E6DF5C7374677DAA416E
und GreenMail scheint in diesen Tagen hier zu sein: