独自のプロパティファイル(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
}
}
まず、@ 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プロジェクトのプロパティファイルの読み方
テストに関しては、他の場所で定義されたプロパティを上書きするSpring 4.1を使用する必要があります。
@TestPropertySource("classpath:application-test.properties")
テストプロパティソースは、オペレーティングシステムの環境またはJavaシステムプロパティ、および@PropertySourceなどのアプリケーションによって追加されたプロパティソースからロードされたものよりも優先順位が高くなります。