JavaMailSenderImpl
and overriding the send
method so that it doesn't really send an email. Here is an example:
import java.util.Properties; import javax.mail.internet.MimeMessage; import org.springframework.mail.MailException; import org.springframework.mail.MailPreparationException; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessagePreparator; public class MockMailSender extends JavaMailSenderImpl { @Override public void send(final MimeMessagePreparator mimeMessagePreparator) throws MailException { final MimeMessage mimeMessage = createMimeMessage(); try { mimeMessagePreparator.prepare(mimeMessage); final String content = (String) mimeMessage.getContent(); final Properties javaMailProperties = getJavaMailProperties(); javaMailProperties.setProperty("mailContent", content); } catch (final Exception e) { throw new MailPreparationException(e); } } }The mock shown above stores the email body into the mail properties object. This is a quick-and-dirty way of getting access to the content of the email just in case you want to check it in your unit test. Here is the associated Spring Java-based configuration:
@Configuration public class MailConfig { @Bean public JavaMailSender mailSender() { final JavaMailSenderImpl sender = new JavaMailSenderImpl(); sender.setHost("mail.host.com"); return sender; } @Bean public Notifier notifier() { return new Notifier(mailSender()); } }The unit-test configuration:
@Configuration @Profile("unit-test") public class UnitTestMailConfig extends MailConfig { @Override @Bean public JavaMailSender mailSender() { return new MockMailSender(); } }For more information about sending emails with Spring 3, see the documentation here. Related Posts:
Spring 3 - JavaConfig: Unit Testing