web-dev-qa-db-ja.com

Spring jUnit Testingのプロパティファイル

独自のプロパティファイル(application-test.properties)とそのスプリング構成ファイル(application-core-test.xml)を持つjUnitテストがあります。

メソッドの1つは、spring configによってインスタンス化されたオブジェクトを使用します。これはスプリングコンポーネントです。クラスのメンバーの1つは、メインプロパティファイルであるapplication.propertiesから値を取得します。 jUnitを介してこの値にアクセスしている間は、常にnullです。実際のプロパティファイルを指すようにプロパティファイルを変更しようとしましたが、うまくいかないようです。

プロパティファイルオブジェクトにアクセスする方法は次のとおりです。

@Component
@PropertySource("classpath:application.properties")
public abstract class A {

    @Value("${test.value}")
    public String value;

    public A(){
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    }

    public A(String text) {
        this();
        // do something with text and value.. here is where I run into NPE
    }

}

public class B extends A { 
     //addtnl code

    private B() {

    }


    private B(String text) {
         super(text)
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:META-INF/spring/application-core-test.xml",
                             "classpath:META-INF/spring/application-schedule-test.xml"})
@PropertySource("classpath:application-test.properties")
public class TestD {

    @Value("${value.works}")
    public String valueWorks;

    @Test
    public void testBlah() {     
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        B b= new B("blah");
        //...addtnl code

    }    
}      
16
user1707141

まず、@ PropertySourceのapplication.propertiesは、ファイルの名前が指定されている場合(これらの一致が重要)、application-test.propertiesを読み取る必要があります。

@PropertySource("classpath:application-test.properties ")

そのファイルは/src/test/resourcesクラスパス(ルート)の下にある必要があります。

application-test.propertiesというファイルにハードコードされた依存関係を指定する理由がわかりません。そのコンポーネントはテスト環境でのみ使用されますか?

通常、行うべきことは、異なるクラスパスに同じ名前のプロパティファイルを置くことです。テストを実行しているかどうかに応じて、どちらかをロードします。

通常レイアウトされたアプリケーションでは、次のことができます。

src/test/resources/application.properties

そして

src/main/resources/application.properties

そして、次のように注入します。

@PropertySource("classpath:application.properties")

さらに良いことは、そのプロパティファイルをSpringコンテキストでBeanとして公開し、それを必要とするコンポーネントにそのBeanを注入することです。このようにして、コードにはapplication.propertiesへの参照が散らばらず、プロパティのソースとして必要なものを使用できます。以下に例を示します。 Springプロジェクトのプロパティファイルの読み方

32
Robert Moskal

テストに関しては、他の場所で定義されたプロパティを上書きするSpring 4.1を使用する必要があります。

@TestPropertySource("classpath:application-test.properties")

テストプロパティソースは、オペレーティングシステムの環境またはJavaシステムプロパティ、および@PropertySourceなどのアプリケーションによって追加されたプロパティソースからロードされたものよりも優先順位が高くなります。

21
sendon1982