私としてMockMailSenderを実装している:MockMailSenderクラスはMailSenderに自動的にautowiredされますか?
@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);
}
}
}
良いことは、私の@RestController
クラスにその自動的@Autowired
MailSenderのオブジェクトにあります。だから私がテストで自分のコードを実行すると、実際には電子メールを送信しませんが、それだけをモックします。しかし、問題は、コードを本番環境にしたい場合、このデフォルトの動作をどのように無効にすることができるのですか?
@Service
@Profile("test")
public class MockMailSender implements MailSender {
...
}
は、その後、あなたがこのようなあなたのユニットテストクラスにアクティブとしてこのプロファイルを設定することができます:
は、統合テストまたは単体テストのみに適したこの方法です。私はMailSenderメンバーがテストクラスではない@RestControllerクラスを考えています。私がばかに聞こえると申し訳ありません。しかし、構成を通じてよりクリーンなソリューションが存在する可能性はありますか? –
はい、統合テストにも適しています。 @ActiveProfilesを使用する代わりに、設定によってプロファイルを設定することもできます。 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.htmlを参照してください。 – Plog