2017-09-12 11 views
0

私として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 { 
    ... 
} 

は、その後、あなたがこのようなあなたのユニットテストクラスにアクティブとしてこのプロファイルを設定することができます:

答えて

2

個人的に私は@Profileのアプローチが好きです。注釈@Profile("test")で最初のサービスをマークし、実際に電子メールを送信するMailSenderインターフェイスの2番目の実装を作成します。

@Service 
@Profile("production") 
public class MailSenderImpl implements MailSender { 
    // Log & send 
} 

サービスを自動配線して使用します。

@Autowired 
MailSender mailSender; 

あなたは次のように構成して現在の環境(別名プロファイル)を設定することができます:私は

@Configuration 
public class EnvironmentConfiguration implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext sc) throws ServletException { 
     sc.setInitParameter("spring.profiles.active", "test"); 
    } 
} 

利点は、同じインターフェイスのより多くの豆が存在するものの、右は1が条件付きで注入されることになるということですSpring-Bootがこの設定をどのくらい正確に管理するかは不明です。とにかく、私はSpring Docs - 25. Profilesと春のブートのプロフィールについてはMkyong'sでもっと読むことをお勧めします。

1

あなたは春のプロファイルを使用し、例えば「テスト」というプロファイルでのみ使用でき、このBeanを持つことができます

@RunWith(SpringRunner.class) 
@ActiveProfiles("test") 
public class myTestClass 
+0

は、統合テストまたは単体テストのみに適したこの方法です。私はMailSenderメンバーがテストクラスではない@RestControllerクラスを考えています。私がばかに聞こえると申し訳ありません。しかし、構成を通じてよりクリーンなソリューションが存在する可能性はありますか? –

+0

はい、統合テストにも適しています。 @ActiveProfilesを使用する代わりに、設定によってプロファイルを設定することもできます。 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.htmlを参照してください。 – Plog

1

複数の選択肢がありますが、おそらくProfiles@Profile注釈付きの2つのMailSenderを使用できます。このような 何か:

@Service @Profile("test") 
public class MockMailSender implements MailSender { 
    //... 
} 
@Service @Profile("production") 
public class ExchangeMailSender implements MailSender { 
    //... 
} 

Here例。

関連する問題