我已将MockMailSender实施为:
@Service
public class MockMailSender implements MailSender {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void send(SimpleMailMessage message) throws MailException {
log.info("to: " + message.getTo());
log.info("subject: " + message.getSubject());
log.info("body: " + message.getText());
}
@Override
public void send(SimpleMailMessage... messages) throws MailException {
for (SimpleMailMessage message: messages
) {
send(message);
}
}
}
好的是它在@Autowired
类中自动@RestController
到MailSender对象。因此,当我在测试中运行我的代码时,它实际上并不发送电子邮件,而只是模拟它。但问题是如果我想在生产中使用我的代码,如何禁用此默认行为?
答案 0 :(得分:2)
我个人喜欢@Profile
方法。使用注释@Profile("test")
标记第一个服务,并创建实际发送电子邮件的MailSender
接口的第二个实现。
@Service
@Profile("production")
public class MailSenderImpl implements MailSender {
// Log & send
}
自动连接服务并使用它。优点是尽管存在更多具有相同界面的bean,但是有条件注入正确的一个:
@Autowired
MailSender mailSender;
您可以使用以下配置配置当前环境(也称为配置文件):
@Configuration
public class EnvironmentConfiguration implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext sc) throws ServletException {
sc.setInitParameter("spring.profiles.active", "test");
}
}
我不确定Spring-Boot究竟会如何管理此配置。无论如何,我建议您在Spring Docs - 25. Profiles阅读更多内容以及Mkyong's处的Spring-Boot配置文件。
答案 1 :(得分:2)
有多种选择,也许你可以使用Profiles和两个由@Profile
注释条件限制的MailSender。
像这样:
@Service @Profile("test")
public class MockMailSender implements MailSender {
//...
}
@Service @Profile("production")
public class ExchangeMailSender implements MailSender {
//...
}
Here一个例子。
答案 2 :(得分:1)
您可以使用Spring配置文件,并且只能在名为“test”的配置文件中使用此bean,例如:
@Service
@Profile("test")
public class MockMailSender implements MailSender {
...
}
然后,您可以在单元测试类中将此配置文件设置为活动状态,如下所示:
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
public class myTestClass