私はいくつかのプロパティを上書きする私のユニットテストのための第二のプロパティファイルをロードしようとしました。
それをロード@PropertySource
の上@Configuration
でそれをロードし、仕事しませんでした@TestPropertySource
どちらか動作しませんでした。のみの設定properties
で直接@TesPropertySource
動作しますが、私はメタアノテーションにそれを作るしようとすると、それは動作しません。
ここではサンプルプロジェクトは、次のとおりです。https://github.com/cptwunderlich/SpringTestProperties
私はすべてのテスト(例えばとに影響を与える一つのファイルをロードすることを好むだろう@PropertySource
、私は上のことを配置する必要はありませんので、)、それは仕事をしない場合には、少なくとも、カスタムメタアノテーションがいいだろう持つ一人ひとりテスト。基本的に私はしたくない全体の設定をコピーし、2つの場所で、それぞれの時間を変更することなく-テスト(spring.datasource.data)のためのDBにいくつかのデータをインポートし、後でまた使用するデータベースを変更します。
重要なビット:
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
public class TestconfigApplicationTests {
@Value("${my.test.property}")
private String testproperty;
@Test
public void assertValue() {
Assert.assertEquals("foobar", testproperty);
}
}
またConfigクラスのテストパッケージに:
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
@PropertySource("classpath:application-test.properties")
public class GlobalTestConfig {
}
更新:
答えの主な提案が使用することです@ActiveProfile
ロード「アプリケーションtest.yaml」になります「試験」のプロファイルをアクティブにします。それはよりbetternだ@TestPropertySource
が、私はまだ、各テストクラスに注釈を配置する必要があります。これは-私はメタアノテーションを作成しようとした動作するはずです -ので、少なくとも私は、私は他の設定をバンドル可能性が1つのカスタム注釈を持っています。しかし、それは動作しません。
完璧なソリューションではなく、各テストに注釈を入れたの、1 Configクラスでグローバルにこれらの設定を設定します。私はまだその解決策を探している、または少なくともこの質問を閉じる前にメタアノテーションをデバッグしています。
編集:私は、JIRA課題を作成しました:SPR-17531
編集します
私はすべての異なる組み合わせを再テストして[OK]を、私は、少し混乱しました:
@TestPropertySource(locations = "classpath:application-test.properties")
テストに、実際に動作します今。ハァッ。@ActiveProfiles("test")
テスト作品に。- メタアノテーション
@ActiveProfiles
んではない仕事。編集:それはありません... - 任意の並べ替え(TestPropertySource、ActiveProfiles、Propertysource)のグローバル設定はありませんではない仕事を
- (テスト/リソースでapplication.propertiesを持つことも仕事、BCにはない。それは上書き、単一のプロパティをしませんが、完全なファイル、つまり、私はすべてを再定義し、重複する必要があると思います。)
EDIT:
OK、私のミス。メタアノテーションは、仕事をする-私は保持ポリシーを設定するのを忘れ、デフォルトはCLASSです。追加@Retention(RUNTIME)
修正されます。
グローバル(テストが実行されているどのように私のIDEで構成せず、すなわち)コードでこれを設定する方法があるように私は今のプロファイルを使用して行く必要がありますので、それは、いないようです。
あなたは使用することができます@ActiveProfiles("test")
。これが設定されますapplication-test.yml
テスト環境にプロパティを。
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class TestconfigApplicationTests {
...
}
我々は異なる環境をターゲットにする必要がある場合は、ビルドでそのための仕組みブートではありますので、追加のライブラリやリファクタリングは必要ありません。
私たちは、単純に定義することができますapplication-environment.properties
内のファイルsrc/main/resources
ディレクトリを-してから、同じ環境名と春のプロファイルを設定します。
我々が定義した場合たとえば、staging
またはtest
環境、その手段を、私たちはその後、ステージングやテストプロファイルとを定義する必要がありますapplication-staging.properties
かapplication-test.properties
。
このenv
ファイルがロードされるとされ、デフォルトプロパティファイルよりも優先されますapplication.properties
。デフォルトのファイルがまだロードされますので注意してください、それは財産の衝突がある場合、環境固有のプロパティファイルで指定性質を意味する、優先されるということだけだapplication-staging.properties
かapplication-test.properties
でものを上書きしますapplication.properties
。
各テストクラスには、独自のプロファイルを使用していますので、あなたは、クラスごとにアクティブなプロファイルを指定する必要があります。
あなたのために関心のあるかもしれない一つの追加的な事はあなたが経由でサービスを模擬できることですconfiguration
クラス
@Configuration
@Profile("mockEntityService")
public class EntityServiceMockProvider {
@Bean
@Primary
public EntityService entityService() {
EntityService mockedEntityService = Mockito.mock(EntityService.class);
Entity entity= Mockito.mock(Entity.class);
when(mockedEntityService.save(any(Entity.class)))
.thenReturn(entity);
return mockedEntityService ;
}
}
例:テストクラスでは、複数のアクティブなプロファイルを使用することができます @ActiveProfiles({"test", "mockEntityService"})
その代わりに、実際の実装を使用してのEntityService
あなたは嘲笑実装を使用します。