1. 概要

このチュートリアルでは、Springのテストでプロパティをオーバーライドするさまざまな方法を見ていきます。

Springは実際にこれに対して多くのソリューションを提供しているので、ここで調査することがかなりあります。

2. 依存関係

もちろん、Springテストを使用するには、テストの依存関係を追加する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.6.1</version>
    <scope>test</scope>
</dependency>

この依存関係には、JUnit5も含まれています。

3. 設定

まず、プロパティを使用するクラスをアプリケーションに作成します。

@Component
public class PropertySourceResolver {

    @Value("${example.firstProperty}") private String firstProperty;
    @Value("${example.secondProperty}") private String secondProperty;

    public String getFirstProperty() {
        return firstProperty;
    }

    public String getSecondProperty() {
        return secondProperty;
    }
}

次に、それらに値を割り当てます。 これを行うには、 src / main / resources:application.propertiesを作成します。

example.firstProperty=defaultFirst
example.secondProperty=defaultSecond

4. プロパティファイルのオーバーライド

次に、プロパティファイルをテストリソースに配置して、プロパティをオーバーライドします。 このファイルは、デフォルトのクラスパスと同じクラスパスにある必要があります。

さらに、デフォルトファイルで指定されているすべてのプロパティキー含まれている必要があります。 したがって、application.propertiesファイルをsrc/ test /resourcesに追加します。

example.firstProperty=file
example.secondProperty=file

また、ソリューションを利用するテストを追加しましょう。

@SpringBootTest
public class TestResourcePropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldTestResourceFile_overridePropertyValues() {
        String firstProperty = propertySourceResolver.getFirstProperty();
        String secondProperty = propertySourceResolver.getSecondProperty();

        assertEquals("file", firstProperty);
        assertEquals("file", secondProperty);
    }
}

このメソッドは、ファイルから複数のプロパティをオーバーライドする場合に非常に効果的です。

また、 example.secondProperty をファイルに入れないと、アプリケーションコンテキストはこのプロパティを検出しません。

5. 春のプロフィール

このセクションでは、Springプロファイルを使用して問題を処理する方法を学習します。 前の方法とは異なり、 これは、デフォルトファイルとプロファイルファイルのプロパティをマージします。

まず、 src / test / resources: application–test.propertiesファイルを作成しましょう。

example.firstProperty=profile

次に、testプロファイルを使用するテストを作成します。

@SpringBootTest
@ActiveProfiles("test")
public class ProfilePropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldProfiledProperty_overridePropertyValues() {
        String firstProperty = propertySourceResolver.getFirstProperty();
        String secondProperty = propertySourceResolver.getSecondProperty();

        assertEquals("profile", firstProperty);
        assertEquals("defaultSecond", secondProperty);
    }
}

このアプローチにより、デフォルト値とテスト値の両方を使用できます。 したがって、これは、ファイルから複数のプロパティをオーバーライドする必要があるが、デフォルトののものも使用したい場合に最適な方法です。

Springプロファイルの詳細については、Springプロファイルの記事をご覧ください。

6. @SpringBootTest

プロパティ値をオーバーライドする別の方法は、@SpringBootTestアノテーションを使用することです。

@SpringBootTest(properties = { "example.firstProperty=annotation" })
public class SpringBootPropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldSpringBootTestAnnotation_overridePropertyValues() {
        String firstProperty = propertySourceResolver.getFirstProperty();
        String secondProperty = propertySourceResolver.getSecondProperty();

        Assert.assertEquals("annotation", firstProperty);
        Assert.assertEquals("defaultSecond", secondProperty);
    }
}

ご覧のとおり、 example.firstPropertyはオーバーライドされていますが、example.secondPropertyはオーバーライドされていません。 したがって、これは、テストの特定のプロパティのみをオーバーライドする必要がある場合に最適なソリューションです。 これは、Spring Bootの使用を必要とする唯一の方法です。

7. TestPropertySourceUtils

このセクションでは、を使用してプロパティをオーバーライドする方法を学習します。 TestPropertySourceUtils のクラス ApplicationContextInitializer。 

TestPropertySourceUtils には、異なるプロパティ値を定義するために使用できる2つのメソッドが付属しています。

テストで使用する初期化子クラスを作成しましょう。

public class PropertyOverrideContextInitializer
  implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    static final String PROPERTY_FIRST_VALUE = "contextClass";

    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
          configurableApplicationContext, "example.firstProperty=" + PROPERTY_FIRST_VALUE);

        TestPropertySourceUtils.addPropertiesFilesToEnvironment(
          configurableApplicationContext, "context-override-application.properties");
    }
}

次に、context-override-application.propertiesファイルをsrc/ test / resources:に追加します。

example.secondProperty=contextFile

最後に、初期化子を使用するテストクラスを作成する必要があります。

@SpringBootTest
@ContextConfiguration(
  initializers = PropertyOverrideContextInitializer.class,
  classes = Application.class)
public class ContextPropertySourceResolverIntegrationTest {

    @Autowired private PropertySourceResolver propertySourceResolver;

    @Test
    public void shouldContext_overridePropertyValues() {
        final String firstProperty = propertySourceResolver.getFirstProperty();
        final String secondProperty = propertySourceResolver.getSecondProperty();

        assertEquals(PropertyOverrideContextInitializer.PROPERTY_FIRST_VALUE, firstProperty);
        assertEquals("contextFile", secondProperty);
    }
}

example.firstPropertyはインラインメソッドからオーバーライドされました。

example.secondProperty は、2番目のメソッドの特定のファイルからオーバーライドされました。 このアプローチにより、コンテキストを初期化するときにさまざまなプロパティ値を定義できます。

8. 結論

この記事では、テストでプロパティをオーバーライドできる複数の方法に焦点を当てました。 また、各ソリューションをいつ使用するか、場合によってはそれらをいつ混合するかについても説明しました。

もちろん、@TestPropertySourceアノテーションも自由に使用できます。

いつものように、この記事の例のコードは、GitHubから入手できます。