在 Spring 引导中测试时注入 MailClient
Injecting MailClient in while testing in Spring Boot
我有这个 class 当我 运行 应用程序时 运行 很好。
@Service("bookManager")
public class BookManagerImpl implements BookManager {
private MailClient mailClient;
..
}
@Service
public class MailClient {
protected static final Logger looger = LoggerFactory.getLogger(MailClient.class);
@Autowired
private JavaMailSender mailSender;
private MailContentBuilder mailContentBuilder;
@Autowired
public MailClient(JavaMailSender mailSender, MailContentBuilder mailContentBuilder) {
this.mailSender = mailSender;
this.mailContentBuilder = mailContentBuilder;
}
//TODO: in a properties
public void prepareAndSend(String recipient, String message) {
MimeMessagePreparator messagePreparator = mimeMessage -> {
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
messageHelper.setFrom("nunito@calzada.com");
messageHelper.setTo(recipient);
messageHelper.setSubject("Sample mail subject");
String content = mailContentBuilder.build(message);
messageHelper.setText(content, true);
};
try {
if (looger.isDebugEnabled()) {
looger.debug("sending email to " + recipient);
}
mailSender.send(messagePreparator);
} catch (MailException e) {
looger.error(e.getMessage());
}
}
}
我想创建一个 ServiceConfig 用于测试目的,但我不知道如何实例化 class MailClient,因为它没有默认构造函数并且构造函数 MailClient() 未定义
@Configuration
public class ServiceConfig {
@Bean
public SmsService smsService() {
return new AWSSMSSender();
}
@Bean
public MailClient mailClient() {
return new MailClient();
}
}
使用建议的解决方案:
return new MailClient(null, null) {
@Override
public void prepareAndSend(String recipient, String message)
{
// do nothing
}
};
我遇到了这个错误:
No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
你应该使用 Stubbing。
存根方法易于使用,并且不涉及单元测试的额外依赖项。基本技术是将协作者实现为具体的 classes,它仅展示被测 class 所需要的协作者整体行为的一小部分。作为示例,请考虑正在测试服务实现的情况。
这取决于你想做什么,在测试中发送电子邮件(可能使用测试 smpt 服务器)或只是模拟发送。在第二种情况下,您可以将 MailClient 子类化为在 prepareAndSend
中不执行任何操作,然后使用它的一个实例。
return new MailClient(null, null) {
@Override
public void prepareAndSend(String recipient, String message)
{
// do nothing
}
};
您可以使用 GreenMail 在 Spring Boot
中测试您的电子邮件功能
你可以参考这个 link : http://dolszewski.com/spring/sending-html-mail-with-spring-boot-and-thymeleaf/
我有这个 class 当我 运行 应用程序时 运行 很好。
@Service("bookManager")
public class BookManagerImpl implements BookManager {
private MailClient mailClient;
..
}
@Service
public class MailClient {
protected static final Logger looger = LoggerFactory.getLogger(MailClient.class);
@Autowired
private JavaMailSender mailSender;
private MailContentBuilder mailContentBuilder;
@Autowired
public MailClient(JavaMailSender mailSender, MailContentBuilder mailContentBuilder) {
this.mailSender = mailSender;
this.mailContentBuilder = mailContentBuilder;
}
//TODO: in a properties
public void prepareAndSend(String recipient, String message) {
MimeMessagePreparator messagePreparator = mimeMessage -> {
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
messageHelper.setFrom("nunito@calzada.com");
messageHelper.setTo(recipient);
messageHelper.setSubject("Sample mail subject");
String content = mailContentBuilder.build(message);
messageHelper.setText(content, true);
};
try {
if (looger.isDebugEnabled()) {
looger.debug("sending email to " + recipient);
}
mailSender.send(messagePreparator);
} catch (MailException e) {
looger.error(e.getMessage());
}
}
}
我想创建一个 ServiceConfig 用于测试目的,但我不知道如何实例化 class MailClient,因为它没有默认构造函数并且构造函数 MailClient() 未定义
@Configuration
public class ServiceConfig {
@Bean
public SmsService smsService() {
return new AWSSMSSender();
}
@Bean
public MailClient mailClient() {
return new MailClient();
}
}
使用建议的解决方案:
return new MailClient(null, null) {
@Override
public void prepareAndSend(String recipient, String message)
{
// do nothing
}
};
我遇到了这个错误:
No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
你应该使用 Stubbing。
存根方法易于使用,并且不涉及单元测试的额外依赖项。基本技术是将协作者实现为具体的 classes,它仅展示被测 class 所需要的协作者整体行为的一小部分。作为示例,请考虑正在测试服务实现的情况。
这取决于你想做什么,在测试中发送电子邮件(可能使用测试 smpt 服务器)或只是模拟发送。在第二种情况下,您可以将 MailClient 子类化为在 prepareAndSend
中不执行任何操作,然后使用它的一个实例。
return new MailClient(null, null) {
@Override
public void prepareAndSend(String recipient, String message)
{
// do nothing
}
};
您可以使用 GreenMail 在 Spring Boot
中测试您的电子邮件功能你可以参考这个 link : http://dolszewski.com/spring/sending-html-mail-with-spring-boot-and-thymeleaf/