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