2017-01-13 3 views
4

私はスプリングブート1.4.3プロジェクトを持っています。 test/resourcesフォルダに2つのプロパティファイルがあります。 a-test.propertiesb-test.propertiesとしましょう。スプリングブートは、@TestPropertySourceアノテーションに関係なく利用可能なすべてのプロパティファイルをロードします

次のようにテストクラスが注釈されている:

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
@TestPropertySource(locations = "classpath:a-test.properties") 

しかし、私はb-test.propertiesからもプロパティが(私はシンプルなプリント出力を介してこれを検証)にロードされている私のテストでご覧ください。

なぜですか?どうすればこれを防ぐことができますか?


a-test.propertiesは私のテスト

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
@TestPropertySource(locations = "classpath:base-test.properties", inheritProperties=false) 
public class EmailServiceContextBasedTest { 

    @SpyBean 
    public JavaMailSender javaMailSender; 

    @Before 
    public void setUp() throws Exception { 

     System.out.println(
      ((JavaMailSenderImpl)javaMailSender).getPassword() 
     ); 
     System.out.println(
      ((JavaMailSenderImpl)javaMailSender).getJavaMailProperties() 
     ); 
    } 


    @Test 
    public void test() throws Exception { 
     // do nothing 
    } 

} 

から抽出された例:SpringBootTest

spring.mail.host=smtp.gmail.com 
spring.mail.port=587 
[email protected] 
spring.mail.password=password 
spring.mail.properties.mail.smtp.auth=false 
spring.mail.properties.mail.smtp.starttls.enable=false 

b-test.properties

spring.mail.host=smtp.gmail.com 
spring.mail.port=587 
[email protected] 
spring.mail.password=myPassword 
spring.mail.properties.mail.smtp.auth=true 
spring.mail.properties.mail.smtp.starttls.enable=true 
+1

どのようにプロパティを読んでいますか?記述している動作を示すコードを追加できますか? – dimitrisli

+0

@dimitrisliええ、確か!私は例を添付しました –

+0

@mat_boyあなたが得る出力と期待する出力を提供してください。あなたの例では、プロパティファイルの1つ(私の場合は 'a-test.properties')に関連付けられたパスワードだけが出力されます。では、b-test.propertiesのプロパティもロードされていることを、どのように確認しましたか? – Omid

答えて

0

のようにそれを書き換えてすることができます。

私はテストフォルダ内のテストで呼び出されていなかった以下の

@SpringBootApplication 
@EnableAutoConfiguration 
@PropertySource("classpath:a-test.properties") 
public class TestApplication { 

    public static void main(final String... args) { 
     SpringApplication.run(TestApplication.class, args); 
    } 
} 

のように定義されたクラスを持っていたが、私はクラスDefaultEmailServiceContextBasedTestでテストを実行するときには、春ブーツで、デフォルトでインスタンス化されたと思います注釈付きで

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 

したがって、問題は私が@PropertySourceを使用したことでした。私は理由を知らないが、その注釈を@TestPropertySourceに置き換えることで矛盾の問題が解決された。

3

注釈は、ドキュメントに関するSpringブートアプリケーションの構成を自動的に表示します。

注釈は、Springブートベースのテストを実行するテストクラスで指定できます。定期的な春TestContextフレームワーク上と上に以下の機能を提供します。具体的な@ContextConfiguration(ローダは= ...)定義されていないとき

  • がデフォルトContextLoaderとしてSpringBootContextLoaderを使用します。
  • ネストされた@Configurationが使用されておらず、明示的なクラスが指定されていない場合、自動的に@SpringBootConfigurationを検索します。
  • カスタム環境プロパティをプロパティ属性を使用して定義できるようにします。
  • 定義済みまたはランダムなポートでリッスンしているコンテナを完全に起動する機能を含む、さまざまなWebEnvironmentモードをサポートします。
  • 完全に動作しているコンテナを使用しているWebテストで使用するTestRestTemplate Beanを登録します。

だから私はあなたが他の場所で他のプロパティをロードすると仮定しますが、真実は@TestPropertySource(locations = "classpath:a-test.properties", inheritProperties=false)だけ確かa-test.propertiesをロードしますです。a-test.propertiesb-test.properties enter image description here

そして@TestPropertySource annotatとして enter image description here

    • :ここ

      は簡単なテストでありますイオン、あなたはまだあなたの問題についてのテストがproperties属性で実行する前にプロパティをオーバーライドするために変更、

      を取得する私は、問題の原因を見つけ@TestPropertySource(locations = "classpath:b-test.properties", properties = {"spring.mail.host=smtp.gmail.com", "spring.mail.port=587", "[email protected]" ......})

  • 0

    アプリケーションレベルの注釈とテスト注釈が混在しています。

    @SpringBootApplicationは、アプリケーションレベルの注釈であり、@PropertySourceアノテーションでのみ使用してください。

    したがって、@PropertySource@TestPropertySourceに置き換えることは、注釈を持たないことと似ています。

    構造を修正する必要があります。

    注釈クラスをメインパッケージに移動し、@PropertySourceアノテーションを追加して戻します。

    同じプロパティを持つ2つのリソースがある理由はわかりませんが、理想的には、アプリケーションとテスト用にそれぞれ1つずつ用意する必要があります。

    のはa-test.propertiesは、アプリケーションの@PropertySourceb-test.propertiesと資源であると仮定しましょう、あなたのテストのための@TestPropertySourceとリソースです。

    b-test.properties@TestPropertySourceのテストクラスを実行すると、クラスパスからロードされた他のプロパティファイルよりも優先されます。

    Springブートアプリケーションをテストする場合、これは必須ではないことがよくあります。 Springブートの@ *テストアノテーションは、明示的に定義していないときは常に、プライマリ の設定を自動的に検索します。

    検索アルゴリズムは、 というテストを含むパッケージから、@ SpringBootApplicationまたは@SpringBootConfiguration 注釈付きクラスが見つかるまで機能します。分かりやすい形でコードを構造化しておけば、通常はメイン設定が見つかる。

    したがって、@SpringBootApplicationwebEnvironmentのクラスでは、テストに埋め込みコンテナが読み込まれます。

    ここでは、テストフレームワークが設定をどのように検出するかについて詳しく説明します。

    http://docs.spring.io/spring-boot/docs/1.4.0.M3/reference/htmlsingle/#boot-features-testing-spring-boot-applications-detecting-config

    あなたがテストのために特別な設定を使用する場合は、@SpringBootTest(classes=MyTestApplication.class)を使用することができます。

    その他のJavaドキュメント

    http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/context/SpringBootTest.html

    0

    あなたが必要なものを行うには、このようなプロファイルを設定することで簡単な:

    @ActiveProfiles( "テスト")

    そして、単に所望の特性を有するapplication-test.propertiesファイルを書き込みますあなたのテストを実行するため。

    関連する問題