春ブーツ:ユニットテストのデフォルトプロパティをオーバーライドする方法

ベンジャミン・マウラー

私はいくつかのプロパティを上書きする私のユニットテストのための第二のプロパティファイルをロードしようとしました。

それをロード@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.propertiesapplication-test.properties

このenvファイルがロードされるとされ、デフォルトプロパティファイルよりも優先されますapplication.propertiesデフォルトのファイルがまだロードされますので注意してください、それは財産の衝突がある場合、環境固有のプロパティファイルで指定性質を意味する、優先されるということだけだapplication-staging.propertiesapplication-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あなたは嘲笑実装を使用します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=206327&siteId=1