Spring Bootテストで自動構成クラスを除外する

1. 概要

このクイックチュートリアルでは、* Spring Bootテストから自動構成クラスを除外する方法について説明します*。
link:/spring-boot-custom-auto-configuration[Spring Bootの自動構成機能]は非常に便利で、多くのセットアップを処理します。 ただし、特定の自動構成がモジュールのテストに干渉することを望まない場合、これはテスト中に問題になる可能性があります。
これの一般的な例は、セキュリティの自動構成です。これは、例にも使用します。

2. テスト例

まず、テストの例を見てみましょう。
*シンプルなホームページを備えた安全なSpring Bootアプリケーションがあります。*
認証なしで「ホームページ」にアクセスしようとすると、応答は「401 UNAUTHORIZED」になります。
link:/rest-assured-tutorial[REST-assured]を使用して呼び出しを行うテストでこれを見てみましょう。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
public class AutoConfigIntegrationTest {

    @Test
    public void givenNoAuthentication_whenAccessHome_thenUnauthorized() {
        int statusCode = RestAssured.get("http://localhost:8080/").statusCode();

        assertEquals(HttpStatus.UNAUTHORIZED.value(), statusCode);
    }

}
一方、認証を使用してホームページに正常にアクセスできます。
@Test
public void givenAuthentication_whenAccessHome_thenOK() {
    int statusCode = RestAssured.given().auth().basic("john", "123")
      .get("http://localhost:8080/")
      .statusCode();

    assertEquals(HttpStatus.OK.value(), statusCode);
}
以下のセクションでは、*テストからconfiguration_SecurityAutoConfiguration_クラスを除外するさまざまな方法を試してみます*。

*3. 使用_ @ EnableAutoConfiguration_ *

テストの構成から特定の自動構成クラスを除外する方法は複数あります。
まず、* _ @ EnableAutoConfiguration(exclude = \ {CLASS_NAME})_アノテーションを使用する方法を見てみましょう*:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
@EnableAutoConfiguration(exclude=SecurityAutoConfiguration.class)
public class ExcludeAutoConfigIntegrationTest {

    @Test
    public void givenSecurityConfigExcluded_whenAccessHome_thenNoAuthenticationRequired() {
        int statusCode = RestAssured.get("http://localhost:8080/").statusCode();

        assertEquals(HttpStatus.OK.value(), statusCode);
    }
}
この例では、_exclude_属性を使用して__SecurityAutoConfiguration __classを除外しましたが、buthttps://docs.spring.io/spring-boot/docs/current/reference/html/auto-configuration-のいずれでも同じことができますclasses.html [自動構成クラス]。
これで、認証なしでホームページにアクセスするテストを実行でき、失敗しなくなりました。

*4. 使用_ @ TestPropertySource_ *

次に、* @@ TestPropertySource_を使用して、プロパティ「_spring.autoconfigure.exclude_“*」を挿入できます。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
@TestPropertySource(properties =
 "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration")
public class ExcludeAutoConfigIntegrationTest {
    // ...
}
プロパティの完全なクラス名(パッケージ名の単純名)を指定する必要があることに注意してください。

5. プロファイルの使用

*プロファイルを使用して、テスト用にプロパティ「_spring.autoconfigure.exclude_」を設定することもできます*
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
public class ExcludeAutoConfigIntegrationTest {
    // ...
}
そして、すべての「_test_」プロファイル固有のプロパティを_application-test.properties_に含めます。
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

6. カスタムテスト構成の使用

最後に、*テスト用に個別の構成アプリケーションを使用できます*:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class, webEnvironment = WebEnvironment.DEFINED_PORT)
public class ExcludeAutoConfigIntegrationTest {
    // ...
}
そして、自動構成クラスを_ @ SpringBootApplication(exclude = \ {CLASS_NAME})_から除外します:
@SpringBootApplication(exclude=SecurityAutoConfiguration.class)
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

7. 結論

この記事では、Spring Bootテストから自動構成クラスを除外するさまざまな方法を検討しました。
完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-testing[GitHubで]で入手できます。