web-dev-qa-db-ja.com

スプリングブート、さまざまなプロファイルを使用したJUnitテスト

2つの異なるプラットフォームをチェックするために、JUnitを使用した統合テストにapplication.propertiesプロファイルを使用しようとしています。

両方のプラットフォームに共通の構成を含む基本構成ファイル_application.properties_でこれを試してみました。さらに、各プラットフォームに固有のプロパティファイル_application-tensorflow.properties_ _application-caffe.properties_を追加しました。プラットフォーム構成ですが、JUnitでは、メインアプリケーションで使用していたアプローチとは動作が異なることがわかりました。

私のテスト構成クラスは次のようになります。

_@Configuration
@PropertySource("classpath:application.properties")
@CompileStatic
@EnableConfigurationProperties
class TestConfig {...}
_

私は@PropertySource("classpath:application.properties")を使用しているので、基本的な構成を認識します。そこで、テンソルフローアプリケーションプロファイルを認識しますが、ファイルから読み取らないことを期待して、_spring.profiles.active=tensorflow_も記述します。_/src/test/resources/application-tensorflow.properties_、またはメインアプリの場合のように_/src/main/resources/application-tensorflow.properties_から。

JUnitテストでスプリングプロファイルを指定する特別な方法はありますか?私がやろうとしていることを達成するためのベストプラクティスは何ですか?

4
Harel Farkash

まず、テストクラスに_@ActiveProfiles_を追加して、アクティブなプロファイルを定義します。

また、構成ファイルをロードするように構成する必要があります。 2つのオプションがあります:

  • @ContextConfiguration(classes = TheConfiguration.class, initializers = ConfigFileApplicationContextInitializer.class)を使用した単純な統合テスト
  • _@SpringBootTest_を使用した完全なSpringBootテスト

テストクラスの例:

_@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles({ "test" })
public class DummyTest {

    @Autowired
    private Environment env;

    @Test
    public void readProps() {
        String value = env.getProperty("prop1") + " " + env.getProperty("prop2");
        assertEquals("Hello World", value);
    }
}
_

これで、ファイル_src/test/resources/application.properties_および_src/test/resources/application-test.properties_が評価されます。

8

テストに注釈を付けてみましたか

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(profiles = {"tensorflow"})

また、application-tensorflow.propertiesが/ src/test/resourcesの下にあることを確認してください

2
user10367961