From 6dfd330fa5ea43c14f5b209daa78a2fb42ef493c Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Wed, 24 May 2023 14:26:52 +0200 Subject: [PATCH] Polish JavaMailSenderTests --- .../mail/javamail/JavaMailSenderImpl.java | 2 +- .../mail/javamail/JavaMailSenderTests.java | 216 +++++++----------- 2 files changed, 84 insertions(+), 134 deletions(-) diff --git a/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java b/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java index 49c4ed0961f..eb8a48834f8 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java +++ b/spring-context-support/src/main/java/org/springframework/mail/javamail/JavaMailSenderImpl.java @@ -200,7 +200,7 @@ public class JavaMailSenderImpl implements JavaMailSender { * Set the mail server port. *

Default is {@link #DEFAULT_PORT}, letting JavaMail use the default * SMTP port (25). - */ + */ public void setPort(int port) { this.port = port; } diff --git a/spring-context-support/src/test/java/org/springframework/mail/javamail/JavaMailSenderTests.java b/spring-context-support/src/test/java/org/springframework/mail/javamail/JavaMailSenderTests.java index 3833641d6bf..8daf7d1b35c 100644 --- a/spring-context-support/src/test/java/org/springframework/mail/javamail/JavaMailSenderTests.java +++ b/spring-context-support/src/test/java/org/springframework/mail/javamail/JavaMailSenderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,17 +16,18 @@ package org.springframework.mail.javamail; -import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.Properties; +import java.util.stream.Stream; import jakarta.activation.FileTypeMap; import jakarta.mail.Address; import jakarta.mail.Message; +import jakarta.mail.Message.RecipientType; import jakarta.mail.MessagingException; import jakarta.mail.NoSuchProviderException; import jakarta.mail.Session; @@ -44,18 +45,22 @@ import org.springframework.util.ObjectUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.Assertions.assertThatNoException; import static org.assertj.core.api.Assertions.entry; /** * @author Juergen Hoeller * @author Stephane Nicoll + * @author Sam Brannen * @since 09.10.2004 */ -public class JavaMailSenderTests { +class JavaMailSenderTests { + + private final MockJavaMailSender sender = new MockJavaMailSender(); + @Test - public void javaMailSenderWithSimpleMessage() throws MessagingException, IOException { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithSimpleMessage() throws Exception { sender.setHost("host"); sender.setPort(30); sender.setUsername("username"); @@ -81,30 +86,19 @@ public class JavaMailSenderTests { assertThat(sender.transport.getSentMessages()).hasSize(1); MimeMessage sentMessage = sender.transport.getSentMessage(0); - List

froms = Arrays.asList(sentMessage.getFrom()); - assertThat(froms).hasSize(1); - assertThat(((InternetAddress) froms.get(0)).getAddress()).isEqualTo("me@mail.org"); - List
replyTos = Arrays.asList(sentMessage.getReplyTo()); - assertThat(((InternetAddress) replyTos.get(0)).getAddress()).isEqualTo("reply@mail.org"); - List
tos = Arrays.asList(sentMessage.getRecipients(Message.RecipientType.TO)); - assertThat(tos).hasSize(1); - assertThat(((InternetAddress) tos.get(0)).getAddress()).isEqualTo("you@mail.org"); - List
ccs = Arrays.asList(sentMessage.getRecipients(Message.RecipientType.CC)); - assertThat(ccs).hasSize(2); - assertThat(((InternetAddress) ccs.get(0)).getAddress()).isEqualTo("he@mail.org"); - assertThat(((InternetAddress) ccs.get(1)).getAddress()).isEqualTo("she@mail.org"); - List
bccs = Arrays.asList(sentMessage.getRecipients(Message.RecipientType.BCC)); - assertThat(bccs).hasSize(2); - assertThat(((InternetAddress) bccs.get(0)).getAddress()).isEqualTo("us@mail.org"); - assertThat(((InternetAddress) bccs.get(1)).getAddress()).isEqualTo("them@mail.org"); + assertThat(addresses(sentMessage.getFrom())).containsExactly("me@mail.org"); + assertThat(addresses(sentMessage.getReplyTo())).containsExactly("reply@mail.org"); + assertThat(addresses(sentMessage.getRecipients(RecipientType.TO))).containsExactly("you@mail.org"); + assertThat(addresses(sentMessage.getRecipients(RecipientType.CC))).containsExactly("he@mail.org", "she@mail.org"); + assertThat(addresses(sentMessage.getRecipients(RecipientType.BCC))).containsExactly("us@mail.org", "them@mail.org"); + assertThat(sentMessage.getSentDate().getTime()).isEqualTo(sentDate.getTime()); assertThat(sentMessage.getSubject()).isEqualTo("my subject"); assertThat(sentMessage.getContent()).isEqualTo("my text"); } @Test - public void javaMailSenderWithSimpleMessages() throws MessagingException { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithSimpleMessages() throws Exception { sender.setHost("host"); sender.setUsername("username"); sender.setPassword("password"); @@ -122,59 +116,49 @@ public class JavaMailSenderTests { assertThat(sender.transport.getSentMessages()).hasSize(2); MimeMessage sentMessage1 = sender.transport.getSentMessage(0); - List
tos1 = Arrays.asList(sentMessage1.getRecipients(Message.RecipientType.TO)); - assertThat(tos1).hasSize(1); - assertThat(((InternetAddress) tos1.get(0)).getAddress()).isEqualTo("he@mail.org"); MimeMessage sentMessage2 = sender.transport.getSentMessage(1); - List
tos2 = Arrays.asList(sentMessage2.getRecipients(Message.RecipientType.TO)); - assertThat(tos2).hasSize(1); - assertThat(((InternetAddress) tos2.get(0)).getAddress()).isEqualTo("she@mail.org"); + assertThat(addresses(sentMessage1.getRecipients(RecipientType.TO))).containsExactly("he@mail.org"); + assertThat(addresses(sentMessage2.getRecipients(RecipientType.TO))).containsExactly("she@mail.org"); } @Test - public void javaMailSenderWithMimeMessage() throws MessagingException { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithMimeMessage() throws Exception { sender.setHost("host"); sender.setUsername("username"); sender.setPassword("password"); MimeMessage mimeMessage = sender.createMimeMessage(); - mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("you@mail.org")); + mimeMessage.setRecipient(RecipientType.TO, new InternetAddress("you@mail.org")); sender.send(mimeMessage); assertThat(sender.transport.getConnectedHost()).isEqualTo("host"); assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); - assertThat(sender.transport.getSentMessages()).hasSize(1); - assertThat(sender.transport.getSentMessage(0)).isEqualTo(mimeMessage); + assertThat(sender.transport.getSentMessages()).containsExactly(mimeMessage); } @Test - public void javaMailSenderWithMimeMessages() throws MessagingException { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithMimeMessages() throws Exception { sender.setHost("host"); sender.setUsername("username"); sender.setPassword("password"); MimeMessage mimeMessage1 = sender.createMimeMessage(); - mimeMessage1.setRecipient(Message.RecipientType.TO, new InternetAddress("he@mail.org")); + mimeMessage1.setRecipient(RecipientType.TO, new InternetAddress("he@mail.org")); MimeMessage mimeMessage2 = sender.createMimeMessage(); - mimeMessage2.setRecipient(Message.RecipientType.TO, new InternetAddress("she@mail.org")); + mimeMessage2.setRecipient(RecipientType.TO, new InternetAddress("she@mail.org")); sender.send(mimeMessage1, mimeMessage2); assertThat(sender.transport.getConnectedHost()).isEqualTo("host"); assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); - assertThat(sender.transport.getSentMessages()).hasSize(2); - assertThat(sender.transport.getSentMessage(0)).isEqualTo(mimeMessage1); - assertThat(sender.transport.getSentMessage(1)).isEqualTo(mimeMessage2); + assertThat(sender.transport.getSentMessages()).containsExactly(mimeMessage1, mimeMessage2); } @Test - public void javaMailSenderWithMimeMessagePreparator() { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithMimeMessagePreparator() { sender.setHost("host"); sender.setUsername("username"); sender.setPassword("password"); @@ -182,7 +166,7 @@ public class JavaMailSenderTests { final List messages = new ArrayList<>(); MimeMessagePreparator preparator = mimeMessage -> { - mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("you@mail.org")); + mimeMessage.setRecipient(RecipientType.TO, new InternetAddress("you@mail.org")); messages.add(mimeMessage); }; sender.send(preparator); @@ -191,13 +175,11 @@ public class JavaMailSenderTests { assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); - assertThat(sender.transport.getSentMessages()).hasSize(1); - assertThat(sender.transport.getSentMessage(0)).isEqualTo(messages.get(0)); + assertThat(sender.transport.getSentMessages()).containsExactly(messages.get(0)); } @Test - public void javaMailSenderWithMimeMessagePreparators() { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithMimeMessagePreparators() { sender.setHost("host"); sender.setUsername("username"); sender.setPassword("password"); @@ -205,11 +187,11 @@ public class JavaMailSenderTests { final List messages = new ArrayList<>(); MimeMessagePreparator preparator1 = mimeMessage -> { - mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("he@mail.org")); + mimeMessage.setRecipient(RecipientType.TO, new InternetAddress("he@mail.org")); messages.add(mimeMessage); }; MimeMessagePreparator preparator2 = mimeMessage -> { - mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("she@mail.org")); + mimeMessage.setRecipient(RecipientType.TO, new InternetAddress("she@mail.org")); messages.add(mimeMessage); }; sender.send(preparator1, preparator2); @@ -218,22 +200,19 @@ public class JavaMailSenderTests { assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); - assertThat(sender.transport.getSentMessages()).hasSize(2); - assertThat(sender.transport.getSentMessage(0)).isEqualTo(messages.get(0)); - assertThat(sender.transport.getSentMessage(1)).isEqualTo(messages.get(1)); + assertThat(messages).hasSize(2); + assertThat(sender.transport.getSentMessages()).containsExactlyElementsOf(messages); } @Test - public void javaMailSenderWithMimeMessageHelper() throws MessagingException { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithMimeMessageHelper() throws Exception { sender.setHost("host"); sender.setUsername("username"); sender.setPassword("password"); MimeMessageHelper message = new MimeMessageHelper(sender.createMimeMessage()); assertThat(message.getEncoding()).isNull(); - boolean condition = message.getFileTypeMap() instanceof ConfigurableMimeFileTypeMap; - assertThat(condition).isTrue(); + assertThat(message.getFileTypeMap()).isInstanceOf(ConfigurableMimeFileTypeMap.class); message.setTo("you@mail.org"); sender.send(message.getMimeMessage()); @@ -242,13 +221,11 @@ public class JavaMailSenderTests { assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); - assertThat(sender.transport.getSentMessages()).hasSize(1); - assertThat(sender.transport.getSentMessage(0)).isEqualTo(message.getMimeMessage()); + assertThat(sender.transport.getSentMessages()).containsExactly(message.getMimeMessage()); } @Test - public void javaMailSenderWithMimeMessageHelperAndSpecificEncoding() throws MessagingException { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithMimeMessageHelperAndSpecificEncoding() throws Exception { sender.setHost("host"); sender.setUsername("username"); sender.setPassword("password"); @@ -266,13 +243,11 @@ public class JavaMailSenderTests { assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); - assertThat(sender.transport.getSentMessages()).hasSize(1); - assertThat(sender.transport.getSentMessage(0)).isEqualTo(message.getMimeMessage()); + assertThat(sender.transport.getSentMessages()).containsExactly(message.getMimeMessage()); } @Test - public void javaMailSenderWithMimeMessageHelperAndDefaultEncoding() throws MessagingException { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithMimeMessageHelperAndDefaultEncoding() throws Exception { sender.setHost("host"); sender.setUsername("username"); sender.setPassword("password"); @@ -291,41 +266,29 @@ public class JavaMailSenderTests { assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); - assertThat(sender.transport.getSentMessages()).hasSize(1); - assertThat(sender.transport.getSentMessage(0)).isEqualTo(message.getMimeMessage()); + assertThat(sender.transport.getSentMessages()).containsExactly(message.getMimeMessage()); } @Test - public void javaMailSenderWithParseExceptionOnSimpleMessage() { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithParseExceptionOnSimpleMessage() { SimpleMailMessage simpleMessage = new SimpleMailMessage(); simpleMessage.setFrom(""); - try { - sender.send(simpleMessage); - } - catch (MailParseException ex) { - // expected - boolean condition = ex.getCause() instanceof AddressException; - assertThat(condition).isTrue(); - } + + assertThatExceptionOfType(MailParseException.class) + .isThrownBy(() -> sender.send(simpleMessage)) + .withCauseInstanceOf(AddressException.class); } @Test - public void javaMailSenderWithParseExceptionOnMimeMessagePreparator() { - MockJavaMailSender sender = new MockJavaMailSender(); + void javaMailSenderWithParseExceptionOnMimeMessagePreparator() { MimeMessagePreparator preparator = mimeMessage -> mimeMessage.setFrom(new InternetAddress("")); - try { - sender.send(preparator); - } - catch (MailParseException ex) { - // expected - boolean condition = ex.getCause() instanceof AddressException; - assertThat(condition).isTrue(); - } + assertThatExceptionOfType(MailParseException.class) + .isThrownBy(() -> sender.send(preparator)) + .withCauseInstanceOf(AddressException.class); } @Test - public void javaMailSenderWithCustomSession() throws MessagingException { + void javaMailSenderWithCustomSession() throws Exception { final Session session = Session.getInstance(new Properties()); MockJavaMailSender sender = new MockJavaMailSender() { @Override @@ -341,7 +304,7 @@ public class JavaMailSenderTests { MimeMessage mimeMessage = sender.createMimeMessage(); mimeMessage.setSubject("custom"); - mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("you@mail.org")); + mimeMessage.setRecipient(RecipientType.TO, new InternetAddress("you@mail.org")); mimeMessage.setSentDate(new GregorianCalendar(2005, 3, 1).getTime()); sender.send(mimeMessage); @@ -349,12 +312,11 @@ public class JavaMailSenderTests { assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); - assertThat(sender.transport.getSentMessages()).hasSize(1); - assertThat(sender.transport.getSentMessage(0)).isEqualTo(mimeMessage); + assertThat(sender.transport.getSentMessages()).containsExactly(mimeMessage); } @Test - public void javaMailProperties() throws MessagingException { + void javaMailProperties() throws Exception { Properties props = new Properties(); props.setProperty("bogusKey", "bogusValue"); MockJavaMailSender sender = new MockJavaMailSender() { @@ -370,44 +332,40 @@ public class JavaMailSenderTests { sender.setPassword("password"); MimeMessage mimeMessage = sender.createMimeMessage(); - mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("you@mail.org")); + mimeMessage.setRecipient(RecipientType.TO, new InternetAddress("you@mail.org")); sender.send(mimeMessage); assertThat(sender.transport.getConnectedHost()).isEqualTo("host"); assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); - assertThat(sender.transport.getSentMessages()).hasSize(1); - assertThat(sender.transport.getSentMessage(0)).isEqualTo(mimeMessage); + assertThat(sender.transport.getSentMessages()).containsExactly(mimeMessage); } @Test - public void failedMailServerConnect() { - MockJavaMailSender sender = new MockJavaMailSender(); + void failedMailServerConnect() { sender.setHost(null); sender.setUsername("username"); sender.setPassword("password"); SimpleMailMessage simpleMessage1 = new SimpleMailMessage(); - assertThatExceptionOfType(MailSendException.class).isThrownBy(() -> - sender.send(simpleMessage1)) - .satisfies(ex -> assertThat(ex.getFailedMessages()).containsExactly(entry(simpleMessage1, (Exception) ex.getCause()))); + assertThatExceptionOfType(MailSendException.class) + .isThrownBy(() -> sender.send(simpleMessage1)) + .satisfies(ex -> assertThat(ex.getFailedMessages()).containsExactly(entry(simpleMessage1, (Exception) ex.getCause()))); } @Test - public void failedMailServerClose() { - MockJavaMailSender sender = new MockJavaMailSender(); + void failedMailServerClose() { sender.setHost(""); sender.setUsername("username"); sender.setPassword("password"); SimpleMailMessage simpleMessage1 = new SimpleMailMessage(); - assertThatExceptionOfType(MailSendException.class).isThrownBy(() -> - sender.send(simpleMessage1)) + assertThatExceptionOfType(MailSendException.class) + .isThrownBy(() -> sender.send(simpleMessage1)) .satisfies(ex -> assertThat(ex.getFailedMessages()).isEmpty()); } @Test - public void failedSimpleMessage() throws MessagingException { - MockJavaMailSender sender = new MockJavaMailSender(); + void failedSimpleMessage() throws Exception { sender.setHost("host"); sender.setUsername("username"); sender.setPassword("password"); @@ -422,68 +380,60 @@ public class JavaMailSenderTests { sender.send(simpleMessage1, simpleMessage2); } catch (MailSendException ex) { - ex.printStackTrace(); assertThat(sender.transport.getConnectedHost()).isEqualTo("host"); assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); assertThat(sender.transport.getSentMessages()).hasSize(1); assertThat(sender.transport.getSentMessage(0).getAllRecipients()[0]).isEqualTo(new InternetAddress("she@mail.org")); - assertThat(ex.getFailedMessages()).hasSize(1); - assertThat(ex.getFailedMessages().keySet().iterator().next()).isEqualTo(simpleMessage1); - Object subEx = ex.getFailedMessages().values().iterator().next(); - boolean condition = subEx instanceof MessagingException; - assertThat(condition).isTrue(); - assertThat(((MessagingException) subEx).getMessage()).isEqualTo("failed"); + assertThat(ex.getFailedMessages().keySet()).containsExactly(simpleMessage1); + Exception subEx = ex.getFailedMessages().values().iterator().next(); + assertThat(subEx).isInstanceOf(MessagingException.class).hasMessage("failed"); } } @Test - public void failedMimeMessage() throws MessagingException { - MockJavaMailSender sender = new MockJavaMailSender(); + void failedMimeMessage() throws Exception { sender.setHost("host"); sender.setUsername("username"); sender.setPassword("password"); MimeMessage mimeMessage1 = sender.createMimeMessage(); - mimeMessage1.setRecipient(Message.RecipientType.TO, new InternetAddress("he@mail.org")); + mimeMessage1.setRecipient(RecipientType.TO, new InternetAddress("he@mail.org")); mimeMessage1.setSubject("fail"); MimeMessage mimeMessage2 = sender.createMimeMessage(); - mimeMessage2.setRecipient(Message.RecipientType.TO, new InternetAddress("she@mail.org")); + mimeMessage2.setRecipient(RecipientType.TO, new InternetAddress("she@mail.org")); try { sender.send(mimeMessage1, mimeMessage2); } catch (MailSendException ex) { - ex.printStackTrace(); assertThat(sender.transport.getConnectedHost()).isEqualTo("host"); assertThat(sender.transport.getConnectedUsername()).isEqualTo("username"); assertThat(sender.transport.getConnectedPassword()).isEqualTo("password"); assertThat(sender.transport.isCloseCalled()).isTrue(); - assertThat(sender.transport.getSentMessages()).hasSize(1); - assertThat(sender.transport.getSentMessage(0)).isEqualTo(mimeMessage2); - assertThat(ex.getFailedMessages()).hasSize(1); - assertThat(ex.getFailedMessages().keySet().iterator().next()).isEqualTo(mimeMessage1); - Object subEx = ex.getFailedMessages().values().iterator().next(); - boolean condition = subEx instanceof MessagingException; - assertThat(condition).isTrue(); - assertThat(((MessagingException) subEx).getMessage()).isEqualTo("failed"); + assertThat(sender.transport.getSentMessages()).containsExactly(mimeMessage2); + assertThat(ex.getFailedMessages().keySet()).containsExactly(mimeMessage1); + Exception subEx = ex.getFailedMessages().values().iterator().next(); + assertThat(subEx).isInstanceOf(MessagingException.class).hasMessage("failed"); } } @Test - public void testConnection() throws MessagingException { - MockJavaMailSender sender = new MockJavaMailSender(); + void testConnection() { sender.setHost("host"); - sender.testConnection(); + assertThatNoException().isThrownBy(sender::testConnection); } @Test - public void testConnectionWithFailure() throws MessagingException { - MockJavaMailSender sender = new MockJavaMailSender(); + void testConnectionWithFailure() { sender.setHost(null); - assertThatExceptionOfType(MessagingException.class).isThrownBy( - sender::testConnection); + assertThatExceptionOfType(MessagingException.class).isThrownBy(sender::testConnection); + } + + + private static Stream addresses(Address[] addresses) { + return Arrays.stream(addresses).map(InternetAddress.class::cast).map(InternetAddress::getAddress); }