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でから入手できます。