2017-06-19 6 views
1

私のSpring Beanの1つ(アプリケーションクラスと言う)に対して、プロパティファイル(prop.properties)からプロパティ(my.property.flag = true/false)の値を取得しています。 @Valueアノテーションを使用します。それは完璧に動作します。インテグレーションテストの@Valueをオーバーライド

プロパティの両方の値、つまりtrueとfalseの両方でテストする必要がある統合テスト(ApplicationItクラスなど)を記述する必要があります。

私のプロパティファイルでは、プロパティの値がtrueに設定されています。私のインテグレーションテストから値を動的にfalseに設定することは可能ですか?例について

prop.properties:

my.property.flag=true 

アプリケーション・クラス・ファイル:

@Component 
    class Application { 
     //This value is fetched from properties file 
     //the value is set to true. 
     @Value(${my.property.flag}) 
     private String isTrue; 
     ...... 
     .......... 
    } 

統合テスト:

class ApplicationIT { 
     //how can I set the value of isTrue here to false? 
    } 
+0

あなたは別の性質は、テストのオーバーライドを使用してファイルを作成することができます。 – shmosel

+0

このプロパティファイルには多くのプロパティがあり、私が持っている要件は1つのプロパティだけです。私はこの単一のプロパティのためだけに新しいプロパティファイルを作成するほど賢明ではないと思います。 – Sandy

+0

おそらくこれをチェックしたいと思うでしょう。https://stackoverflow.com/questions/16478679/update-field-annotated-with-value-in-runtime –

答えて

4

次のようにテストクラスのテストプロパティを指定することができます。

@RunWith(SpringRunner.class) 
@TestPropertySource(properties = {"spring.main.banner-mode=off", "my.property.flag=false"}) 
public class MyTest { 

春は、プロパティのオーバーライドの階層全体を持っているので、これは欠点は、あなたが異なる値に対して別々のテストクラスを必要としている、かなりうまく動作します。 Spring Bootを使用している場合は、同じ機能を提供する別の注釈がありますが、テスト環境を設定するためのオプションもあります。例:

@SpringBootTest(properties = {"spring.main.banner-mode=off", "my.property.flag=false"}) 

また、ハードコードされたテストプロパティを処理するには、別のテストクラスが必要です。

0

好ましく、代わりにフィールド注入の使用コンストラクタ注入は:

@Component 
class Application { 

    Application(@Value("${my.property.flag}") boolean flag) { 
     ... 
    } 
} 

これは、引数を渡すのと同じくらい簡単モックまたはテスト値を使用して行います。

1

いい古い反射方法を言いたいと思います。あなたは、スプリングを使用することができ、あなたのコンポーネントに配線した後、それのためのユーティリティクラスを提供:

ReflectionTestUtils.setField(component, "isTrue", true) 

あなたは必然的なテストであなたが望む任意の値に変更することができ

関連する問題