MockMailSender类自动自动连接到MailSender?

时间:2017-09-12 13:29:49

标签: java spring maven spring-boot junit

我已将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对象。因此,当我在测试中运行我的代码时,它实际上并不发送电子邮件,而只是模拟它。但问题是如果我想在生产中使用我的代码,如何禁用此默认行为?

3 个答案:

答案 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