2016-08-11 2 views
4

私は春のブートアプリケーションを持っています。私はJunitテストを書いています。 私はapp.properties(src/main/resources/application.propertiesで定義されています)とAppConfig(src/main/java/hello/AppConfig.java)で設定されたStatus Beanから値を注入しようとしています。私は、Beanがautowired(デバッガを介してnullではない)が値が設定されていないことがわかります。ここでspringブートアプリケーションのJunitテストでappliction.propertiesのプロパティが利用できないのはなぜですか?

はapplication.properties

のsrc /メイン/リソース/ application.propertie

app.name=rest-service 
app.version=1.0.0-SNAPSHOT 

のsrc /メイン/ javaの/ハロー/ AppConfig.java

@Configuration 
public class AppConfig { 

    @Value("${app.version}") 
    private String version; 
    @Value("${app.name}") 
    private String name; 


    @Bean 
    public Status status(){ 
     return new Status(name,version); 
    } 

} 
です

//ステータスは名前とバージョンのフィールドを持つ単純なpojoです

SRC /試験/ジャワ/ハロー/ GreetingControllerTests.java

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class}) 
@WebAppConfiguration 
public class GreetingControllerTests { 


    @Autowired 
    Environment envi; 

    @Autowired 
    Status status; 

    @Value("${app.name:notConfigured}") 
    String appName; 

    private String env; 

    @Before 
    public void init(){ 
     System.out.println(status.getName()); 
     System.out.println(appName); 
     env=envi.getActiveProfiles()[0]; 
    } 

    @Test 
    public void should_fail(){ 
     if (env.equalsIgnoreCase("DEV")){ 
      assertThat(false).isFalse(); 
     } 
     if (env.equalsIgnoreCase("QA1")){ 
      System.out.println("failing the test"); 
      fail(); 
     } 
    } 
} 

Iはinitメソッドにデバッガを設定し、正しい値が設定された両方appNamestatus Beanが注入されないことを見出しました。ステータスBeanは注入されます。値は設定されません。

+0

あなたの 'Application'クラスはどのように見えますか? –

+0

application.propertiesに配置されていない文字があります。 'app。バージョン 'には' = ' –

+0

@ShawnClarkがありません。ここでコードをチェックアウトすることができます。 https://bitbucket.org/SpringDevSeattle/gs-rest-service –

答えて

4

このプロジェクトを共有していただき、ありがとうございます。それは多くの作業をより簡単にしました。どのように私はそれがすべて働いているのか理解するために私のプルリクエスト(コメント付き)を参照してください。

https://bitbucket.org/SpringDevSeattle/gs-rest-service/pull-requests/4/updating-project-for-spring-boot-14/diff

*更新*あなたは注釈が原因の新しい注釈で、いくつかの古い春の注釈を混合に上書きされていました。 application.properties not being populated in the environmentのgoogle検索に基づいて解決策を私に指摘するためのspring-boot properties not @Autowiredへのクレジットあなたは@SpringApplicationConfigurationを見れば

@ContextConfiguration(loader = SpringApplicationContextLoader.class) 
@Documented 
@Inherited 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@Deprecated 
public @interface SpringApplicationConfiguration { 

それは実際に他の注釈の数で構成されています。重要なものは@ContextConfigurationです。 @SpringApplicationConfigurationの場合、ローダーを使用し、そのローダーはクラスパスをスキャンして、適切な構成ファイルと、ロードするコンポーネント(application.propertiesを環境に読み込むもの)を探します。テストの中で、あなたの宣言とその注釈をオーバーライドします。

@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class}) 

をこれは、他のコンフィギュレーションファイルをスキャンせずにTestConfigとのAppConfigクラスをロードするために春を強制します。アノテーションをコメントアウトして実行すると、テストが成功し、init()メソッドをデバッグすると注入された値が表示されます。

+0

リファクタリングに時間を割いていただきありがとうございます。私はあなたの努力に感謝します。私は本当になぜ私はapplication.propertiesから値を注入することができませんでした。もしあなたがそれを助けることができるなら、してください。私はあなたのプルリクエストをマージしますが、私はどこが間違っているのかを知りたいです。 –

+0

私のプルリクエストに関するコメントは説明しています。 Spring Boot 1.4では、テストの実行方法が変更されました。注釈は廃止されていることがわかります。私は戻って古い1.3のアノテーションを使い、それを動作させようとしましたが、既に1.4のプロジェクトを設定しているのを見て、私は新しいものをいかに活用するかを見ていきたいと思っていました。 –

+0

問題が見つかりました...私はここにすべてを入力することはできませんので、答えを更新しました。 –

0

あなたのテストでは、リソースディレクトリに別のプロパティファイルが必要です。

/src/test/resources 

これは、junitが探している場所です。

+0

デフォルトでは、application-test.propertiesという名前にする必要があります。別の名前を使用する場合は、 '@ TestPropertySource'も使用する必要があります。 – JudgingNotJudging

+0

私は別のプロファイルを持っている場合、ex application-dev.propertiesのために、src/test/resourcesにapplication-dev-test.propertiesを持つ必要がありますか?ちなみに –

+0

私はsrc/test/resourcesにapplication-test.propertiesを追加しましたが、まだ値が注入されていませんか? –

関連する問題