Spring Boot アプリケーションのテスト

Spring Boot アプリケーションは Spring ApplicationContext (Javadoc) であるため、通常の Spring コンテキストで行うテスト以外に特別なことを行う必要はありません。

Spring Boot の外部プロパティ、ログ記録、その他の機能は、SpringApplication (Javadoc) を使用してコンテキストを作成した場合にのみ、デフォルトでコンテキストにインストールされます。

Spring Boot は @SpringBootTest (Javadoc) アノテーションを提供します。これは、Spring Boot 機能が必要な場合に、標準の spring-test @ContextConfiguration (Javadoc) アノテーションの代替として使用できます。アノテーションは、SpringApplication (Javadoc) を通じてテストで使用される ApplicationContext の作成によって機能します。@SpringBootTest (Javadoc) に加えて、アプリケーションのより具体的なスライスをテストするための他のアノテーションも多数提供されています。

JUnit 4 を使用している場合は、テストに @RunWith(SpringRunner.class) も追加することを忘れないでください。そうしないと、アノテーションは無視されます。JUnit 6 を使用している場合は、@SpringBootTest (Javadoc) と同等の @ExtendWith(SpringExtension.class) を追加する必要はありません。他の @…​Test アノテーションにはすでに @SpringBootTest (Javadoc) がアノテーションされています。

デフォルトでは、@SpringBootTest (Javadoc) はサーバーを起動しません。@SpringBootTest (Javadoc) の webEnvironment 属性を使用して、テストの実行方法をさらに調整できます。

テストが @Transactional (Javadoc) の場合、デフォルトでは各テストメソッドの終了時にトランザクションがロールバックされます。ただし、この構成を RANDOM_PORT または DEFINED_PORT で使用すると実際のサーブレット環境が暗黙的に提供されるため、HTTP クライアントとサーバーは別々のスレッドで実行され、別々のトランザクションで実行されます。この場合、サーバーで開始されたトランザクションはロールバックされません。
アプリケーションが管理サーバーに別のポートを使用する場合、webEnvironment = WebEnvironment.RANDOM_PORT を使用した @SpringBootTest (Javadoc) は別のランダムポートで管理サーバーを起動します。

Web アプリケーション型の検出

Spring MVC が使用可能な場合、通常の MVC ベースのアプリケーションコンテキストが構成されます。Spring WebFlux しかない場合は、それを検出し、代わりに WebFlux ベースのアプリケーションコンテキストを構成します。

両方が存在する場合、Spring MVC が優先されます。このシナリオでリアクティブ Web アプリケーションをテストする場合は、spring.main.web-application-type プロパティを設定する必要があります。

  • Java

  • Kotlin

import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest(properties = "spring.main.web-application-type=reactive")
class MyWebFluxTests {

	// ...

}
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest(properties = ["spring.main.web-application-type=reactive"])
class MyWebFluxTests {

	// ...

}

テスト構成の検出

Spring Test フレームワークに精通している場合は、どの Spring @Configuration (Javadoc) をロードするかを指定するために @ContextConfiguration(classes=…​) を使用することに慣れているかもしれません。あるいは、テスト内でネストされた @Configuration (Javadoc) クラスを頻繁に使用していたかもしれません。

Spring Boot アプリケーションをテストする場合、これは多くの場合必要ありません。Spring Boot の @*Test アノテーションは、明示的に定義しない限り、プライマリ設定を自動的に検索します。

検索アルゴリズムは、テストを含むパッケージから、@SpringBootApplication (Javadoc) または @SpringBootConfiguration (Javadoc) でアノテーションが付けられたクラスが見つかるまで上方に進み続けます。コードを適切なメソッドで構造化している限り、通常はメイン構成が見つかります。

@SpringBootApplication (Javadoc) の基盤となるコンポーネントスキャン構成では、スライスが期待どおりに機能することを確認するために使用される除外フィルターが定義されています。@SpringBootApplication (Javadoc) アノテーション付きクラスで明示的な @ComponentScan (Javadoc) ディレクティブを使用している場合は、これらのフィルターが無効になることに注意してください。スライスを使用している場合は、再度定義する必要があります。

プライマリ構成をカスタマイズする場合は、ネストされた @TestConfiguration (Javadoc) クラスを使用できます。アプリケーションのプライマリ構成の代わりに使用されるネストされた @Configuration (Javadoc) クラスとは異なり、ネストされた @TestConfiguration (Javadoc) クラスはアプリケーションのプライマリ構成に加えて使用されます。

Spring のテストフレームワークは、テスト間のアプリケーションコンテキストをキャッシュします。テストが同じ構成を共有している限り(検出方法に関係なく)、コンテキストをロードする潜在的に時間のかかるプロセスは 1 回しか発生しません。

テストコンフィギュレーションのメインメソッドの使用

通常、@SpringBootTest (Javadoc) によって検出されたテスト構成は、メインの @SpringBootApplication (Javadoc) になります。ほとんどの適切に構造化されたアプリケーションでは、この構成クラスには、アプリケーションの起動に使用される main メソッドも含まれます。

例: 以下は、典型的な Spring Boot アプリケーションの非常に一般的なコードパターンです。

  • Java

  • Kotlin

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {

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

}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.docs.using.structuringyourcode.locatingthemainclass.MyApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class MyApplication

fun main(args: Array<String>) {
	runApplication<MyApplication>(*args)
}

上記の例では、main メソッドは SpringApplication.run(Class, String…​) (Javadoc) に委譲する以外は何も行いません。ただし、SpringApplication.run(Class, String…​) (Javadoc) を呼び出す前にカスタマイズを適用する、より複雑な main メソッドを使用することは可能です。

例: バナーモードを変更し、追加のプロファイルを設定するアプリケーションは次のとおりです。

  • Java

  • Kotlin

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {

	public static void main(String[] args) {
		SpringApplication application = new SpringApplication(MyApplication.class);
		application.setBannerMode(Banner.Mode.OFF);
		application.setAdditionalProfiles("myprofile");
		application.run(args);
	}

}
import org.springframework.boot.Banner
import org.springframework.boot.runApplication
import org.springframework.boot.autoconfigure.SpringBootApplication

@SpringBootApplication
class MyApplication

fun main(args: Array<String>) {
	runApplication<MyApplication>(*args) {
		setBannerMode(Banner.Mode.OFF)
		setAdditionalProfiles("myprofile")
	}
}

main メソッドのカスタマイズは結果の ApplicationContext (Javadoc) に影響を与える可能性があるため、テストで使用する ApplicationContext (Javadoc) を作成するために main メソッドを使用することもできます。デフォルトでは、@SpringBootTest (Javadoc) は main メソッドを呼び出さず、代わりにクラス自体が直接 ApplicationContext (Javadoc) を作成するために使用されます。

この動作を変更する場合は、@SpringBootTest (Javadoc) の useMainMethod 属性を SpringBootTest.UseMainMethod.ALWAYS (Javadoc) または SpringBootTest.UseMainMethod.WHEN_AVAILABLE (Javadoc) に変更できます。ALWAYS に設定すると、main メソッドが見つからない場合にテストは失敗します。WHEN_AVAILABLE に設定すると、使用可能な場合は main メソッドが使用され、それ以外の場合は標準の読み込みメカニズムが使用されます。

例: 次のテストは、MyApplication の main メソッドを呼び出して ApplicationContext (Javadoc) を作成します。メインメソッドが追加のプロファイルを設定すると、ApplicationContext (Javadoc) の起動時にそれらのプロファイルがアクティブになります。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.UseMainMethod;

@SpringBootTest(useMainMethod = UseMainMethod.ALWAYS)
class MyApplicationTests {

	@Test
	void exampleTest() {
		// ...
	}

}
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.UseMainMethod

@SpringBootTest(useMainMethod = UseMainMethod.ALWAYS)
class MyApplicationTests {

	@Test
	fun exampleTest() {
		// ...
	}

}

テスト構成の除外

アプリケーションでコンポーネントスキャンを使用する場合 (たとえば、@SpringBootApplication (Javadoc) または @ComponentScan (Javadoc) を使用する場合)、特定のテスト専用に作成した最上位の構成クラスが、誤ってすべての場所で取得されることがあります。

前に説明したように、@TestConfiguration (Javadoc) はテストの内部クラスで使用して、プライマリ構成をカスタマイズできます。@TestConfiguration (Javadoc) はトップレベルクラスでも使用できます。これを行うと、クラスはスキャンによって取得されないことを示します。次の例に示すように、必要な場所にクラスを明示的にインポートできます。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;

@SpringBootTest
@Import(MyTestsConfiguration.class)
class MyTests {

	@Test
	void exampleTest() {
		// ...
	}

}
import org.junit.jupiter.api.Test
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.context.annotation.Import

@SpringBootTest
@Import(MyTestsConfiguration::class)
class MyTests {

	@Test
	fun exampleTest() {
		// ...
	}

}
@ComponentScan (Javadoc) を直接使用する場合 (つまり、@SpringBootApplication (Javadoc) を経由しない場合)、TypeExcludeFilter (Javadoc) を登録する必要があります。詳細については、TypeExcludeFilter (Javadoc) API ドキュメントを参照してください。
インポートされた @TestConfiguration (Javadoc) は内部クラスの @TestConfiguration (Javadoc) よりも先に処理され、インポートされた @TestConfiguration (Javadoc) はコンポーネントスキャンで見つかった構成よりも先に処理されます。一般的に、この順序の違いは目立った影響はありませんが、Bean オーバーライドに依存している場合は注意が必要です。

アプリケーション引数の使用

アプリケーションが引数を必要とする場合は、args 属性を使用して @SpringBootTest (Javadoc) に引数を挿入させることができます。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.test.context.SpringBootTest;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest(args = "--app.test=one")
class MyApplicationArgumentTests {

	@Test
	void applicationArgumentsPopulated(@Autowired ApplicationArguments args) {
		assertThat(args.getOptionNames()).containsOnly("app.test");
		assertThat(args.getOptionValues("app.test")).containsOnly("one");
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.ApplicationArguments
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest(args = ["--app.test=one"])
class MyApplicationArgumentTests {

	@Test
	fun applicationArgumentsPopulated(@Autowired args: ApplicationArguments) {
		assertThat(args.optionNames).containsOnly("app.test")
		assertThat(args.getOptionValues("app.test")).containsOnly("one")
	}

}

モック環境でのテスト

デフォルトでは、@SpringBootTest (Javadoc) はサーバーを起動せず、代わりに Web エンドポイントをテストするためのモック環境を設定します。

Spring MVC を使用すると、MockMvc を使って Web エンドポイントをクエリできます。以下の統合が可能です。

次の例は、利用可能な統合を示しています。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureRestTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.assertj.MockMvcTester;
import org.springframework.test.web.servlet.client.RestTestClient;
import org.springframework.test.web.servlet.client.RestTestClient.ResponseSpec;
import org.springframework.test.web.servlet.client.assertj.RestTestClientResponse;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureRestTestClient
@AutoConfigureWebTestClient
class MyMockMvcTests {

	@Test
	void testWithMockMvc(@Autowired MockMvc mvc) throws Exception {
		mvc.perform(get("/"))
				.andExpect(status().isOk())
				.andExpect(content().string("Hello World"));
	}

	@Test // If AssertJ is on the classpath, you can use MockMvcTester
	void testWithMockMvcTester(@Autowired MockMvcTester mvc) {
		assertThat(mvc.get().uri("/"))
				.hasStatusOk()
				.hasBodyTextEqualTo("Hello World");
	}

	@Test
	void testWithRestTestClient(@Autowired RestTestClient restClient) {
		restClient
				.get().uri("/")
				.exchange()
				.expectStatus().isOk()
				.expectBody(String.class).isEqualTo("Hello World");
	}

	@Test // If you prefer AssertJ, dedicated assertions are available
	void testWithRestTestClientAssertJ(@Autowired RestTestClient restClient) {
		ResponseSpec spec = restClient.get().uri("/").exchange();
		RestTestClientResponse response = RestTestClientResponse.from(spec);
		assertThat(response).hasStatusOk()
				.bodyText().isEqualTo("Hello World");
	}

	@Test // If Spring WebFlux is on the classpath
	void testWithWebTestClient(@Autowired WebTestClient webClient) {
		webClient
				.get().uri("/")
				.exchange()
				.expectStatus().isOk()
				.expectBody(String.class).isEqualTo("Hello World");
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureRestTestClient
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc
import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient
import org.springframework.test.web.reactive.server.WebTestClient
import org.springframework.test.web.reactive.server.expectBody
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.assertj.MockMvcTester
import org.springframework.test.web.servlet.client.RestTestClient
import org.springframework.test.web.servlet.client.assertj.RestTestClientResponse
import org.springframework.test.web.servlet.client.expectBody
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.content
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status

@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureRestTestClient
@AutoConfigureWebTestClient
class MyMockMvcTests {

	@Test
	fun testWithMockMvc(@Autowired mvc: MockMvc) {
		mvc.perform(get("/"))
			.andExpect(status().isOk())
			.andExpect(content().string("Hello World"))
	}

	@Test // If AssertJ is on the classpath, you can use MockMvcTester
	fun testWithMockMvcTester(@Autowired mvc: MockMvcTester) {
		assertThat(mvc.get().uri("/")).hasStatusOk()
			.hasBodyTextEqualTo("Hello World")
	}

	@Test
	fun testWithRestTestClient(@Autowired webClient: RestTestClient) {
		webClient
			.get().uri("/")
			.exchange()
			.expectStatus().isOk
			.expectBody<String>().isEqualTo("Hello World")
	}

	@Test // If you prefer AssertJ, dedicated assertions are available
	fun testWithRestTestClientAssertJ(@Autowired webClient: RestTestClient) {
		val spec = webClient.get().uri("/").exchange()
		val response = RestTestClientResponse.from(spec)
		assertThat(response).hasStatusOk().bodyText().isEqualTo("Hello World")
	}


	@Test // If Spring WebFlux is on the classpath
	fun testWithWebTestClient(@Autowired webClient: WebTestClient) {
		webClient
			.get().uri("/")
			.exchange()
			.expectStatus().isOk
			.expectBody<String>().isEqualTo("Hello World")
	}

}
Web レイヤーのみに焦点を当て、完全な ApplicationContext (Javadoc) を開始したくない場合は、代わりに @WebMvcTest を使用するを検討してください。

Spring WebFlux エンドポイントでは、次の例に示すように WebTestClient を使用できます。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient;
import org.springframework.test.web.reactive.server.WebTestClient;

@SpringBootTest
@AutoConfigureWebTestClient
class MyMockWebTestClientTests {

	@Test
	void exampleTest(@Autowired WebTestClient webClient) {
		webClient
			.get().uri("/")
			.exchange()
			.expectStatus().isOk()
			.expectBody(String.class).isEqualTo("Hello World");
	}

}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient
import org.springframework.test.web.reactive.server.WebTestClient
import org.springframework.test.web.reactive.server.expectBody

@SpringBootTest
@AutoConfigureWebTestClient
class MyMockWebTestClientTests {

	@Test
	fun exampleTest(@Autowired webClient: WebTestClient) {
		webClient
			.get().uri("/")
			.exchange()
			.expectStatus().isOk
			.expectBody<String>().isEqualTo("Hello World")
	}

}

モック環境内でのテストは、通常、完全なサーブレットコンテナーで実行するよりも高速です。ただし、モックは Spring MVC レイヤーで発生するため、下位レベルのサーブレットコンテナーの動作に依存するコードを MockMvc で直接テストすることはできません。

例: Spring Boot のエラー処理は、サーブレットコンテナーによって提供される「エラーページ」サポートに基づいています。つまり、MVC レイヤーのスローをテストして例外を期待どおりに処理することはできますが、特定のカスタムエラーページがレンダリングされることを直接テストすることはできません。これらの下位レベルの関心事をテストする必要がある場合は、次のセクションで説明するように、完全に実行されているサーバーを起動できます。

実行中のサーバーでのテスト

完全に稼働しているサーバーを起動する必要がある場合は、ランダムなポートを使用することをお勧めします。@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) を使用すると、テストを実行するたびに使用可能なポートがランダムに選択されます。

@LocalServerPort (Javadoc) アノテーションを使用すると、実際に使用されるポートをテストに挿入できます。

起動されたサーバーに REST 呼び出しを行う必要があるテストでは、テストクラスに @AutoConfigureRestTestClient (Javadoc) のアノテーションを付けることで、RestTestClient を自動接続できます。

構成されたクライアントは、実行中のサーバーへの相対リンクを解決し、次の例に示すように、レスポンスを検証するための専用の API が付属しています。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureRestTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.web.servlet.client.RestTestClient;

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestTestClient
class MyRandomPortRestTestClientTests {

	@Test
	void exampleTest(@Autowired RestTestClient restClient) {
		restClient
			.get().uri("/")
			.exchange()
			.expectStatus().isOk()
			.expectBody(String.class).isEqualTo("Hello World");
	}

}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureRestTestClient
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment
import org.springframework.test.web.servlet.client.RestTestClient
import org.springframework.test.web.servlet.client.expectBody

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestTestClient
class MyRandomPortRestTestClientTests {

	@Test
	fun exampleTest(@Autowired webClient: RestTestClient) {
		webClient
			.get().uri("/")
			.exchange()
			.expectStatus().isOk
			.expectBody<String>().isEqualTo("Hello World")
	}

}

AssertJ を使用する場合は、次の例に示すように、RestTestClientResponse (Javadoc) から専用のアサーションを利用できます。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureRestTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.web.servlet.client.RestTestClient;
import org.springframework.test.web.servlet.client.RestTestClient.ResponseSpec;
import org.springframework.test.web.servlet.client.assertj.RestTestClientResponse;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestTestClient
class MyRandomPortRestTestClientAssertJTests {

	@Test
	void exampleTest(@Autowired RestTestClient restClient) {
		ResponseSpec spec = restClient.get().uri("/").exchange();
		RestTestClientResponse response = RestTestClientResponse.from(spec);
		assertThat(response).hasStatusOk().bodyText().isEqualTo("Hello World");
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureRestTestClient
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment
import org.springframework.test.web.servlet.client.RestTestClient
import org.springframework.test.web.servlet.client.assertj.RestTestClientResponse

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestTestClient
class MyRandomPortRestTestClientAssertJTests {

	@Test
	fun exampleTest(@Autowired webClient: RestTestClient) {
		val exchange = webClient.get().uri("/").exchange()
		val response = RestTestClientResponse.from(exchange)
		assertThat(response).hasStatusOk()
			.bodyText().isEqualTo("Hello World")
	}

}

クラスパスに spring-webflux がある場合は、テストクラスに @AutoConfigureWebTestClient (Javadoc) のアノテーションを付けることで、WebTestClient をオートワイヤーすることもできます。

WebTestClient は、次の例に示すように、同様の API を提供します。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient;
import org.springframework.test.web.reactive.server.WebTestClient;

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
class MyRandomPortWebTestClientTests {

	@Test
	void exampleTest(@Autowired WebTestClient webClient) {
		webClient
			.get().uri("/")
			.exchange()
			.expectStatus().isOk()
			.expectBody(String.class).isEqualTo("Hello World");
	}

}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment
import org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient
import org.springframework.test.web.reactive.server.WebTestClient
import org.springframework.test.web.reactive.server.expectBody

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
class MyRandomPortWebTestClientTests {

	@Test
	fun exampleTest(@Autowired webClient: WebTestClient) {
		webClient
			.get().uri("/")
			.exchange()
			.expectStatus().isOk
			.expectBody<String>().isEqualTo("Hello World")
	}

}
WebTestClient (Javadoc) は、モック環境でも使用できます。テストクラスに spring-boot-webflux-test@AutoConfigureWebTestClient (Javadoc) アノテーションを付けることで、実行中のサーバーが不要になります。

spring-boot-resttestclient モジュールは TestRestTemplate (Javadoc) 機能も提供します。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.resttestclient.TestRestTemplate;
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureTestRestTemplate
class MyRandomPortTestRestTemplateTests {

	@Test
	void exampleTest(@Autowired TestRestTemplate restTemplate) {
		String body = restTemplate.getForObject("/", String.class);
		assertThat(body).isEqualTo("Hello World");
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment
import org.springframework.boot.resttestclient.TestRestTemplate
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureTestRestTemplate
class MyRandomPortTestRestTemplateTests {

	@Test
	fun exampleTest(@Autowired restTemplate: TestRestTemplate) {
		val body = restTemplate.getForObject("/", String::class.java)
		assertThat(body).isEqualTo("Hello World")
	}

}

TestRestTemplate を使用するには、spring-boot-restclient への依存関係も必要です。この依存関係を追加すると、RestClient.Builder の自動構成が有効になるため、注意してください。メインコードで RestClient.Builder を使用している場合は、spring-boot-restclient 依存関係をアプリケーションのテストクラスパスだけでなくメインクラスパスにも宣言してください。

RestTestClient のカスタマイズ

RestTestClient (Javadoc) Bean をカスタマイズするには、RestTestClientBuilderCustomizer (Javadoc) Bean を構成します。このような Bean はすべて、RestTestClient (Javadoc) の作成に使用される RestTestClient.Builder (Javadoc) で呼び出されます。

WebTestClient のカスタマイズ

WebTestClient (Javadoc) Bean をカスタマイズするには、WebTestClientBuilderCustomizer (Javadoc) Bean を構成します。このような Bean はすべて、WebTestClient (Javadoc) の作成に使用される WebTestClient.Builder (Javadoc) で呼び出されます。

JMX を使用する

テストコンテキストフレームワークはコンテキストをキャッシュするため、同一のコンポーネントが同じドメインに登録されるのを防ぐために、JMX はデフォルトで無効になっています。このようなテストで MBeanServer (標準 Javadoc) にアクセスする必要がある場合は、それをダーティとしてマークすることも検討してください。

  • Java

  • Kotlin

import javax.management.MBeanServer;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest(properties = "spring.jmx.enabled=true")
@DirtiesContext
class MyJmxTests {

	@Autowired
	private MBeanServer mBeanServer;

	@Test
	void exampleTest() {
		assertThat(this.mBeanServer.getDomains()).contains("java.lang");
		// ...
	}

}
import javax.management.MBeanServer

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.annotation.DirtiesContext

@SpringBootTest(properties = ["spring.jmx.enabled=true"])
@DirtiesContext
class MyJmxTests(@Autowired val mBeanServer: MBeanServer) {

	@Test
	fun exampleTest() {
		assertThat(mBeanServer.domains).contains("java.lang")
		// ...
	}

}

観測値の使用

スライスされたテストに spring-boot-micrometer-tracing-test の @AutoConfigureTracing (Javadoc) または spring-boot-micrometer-metrics-test@AutoConfigureMetrics (Javadoc) をアノテーション付けると、ObservationRegistry (英語) が自動的に構成されます。

メトリクスの使用

クラスパスに関係なく、@SpringBootTest (Javadoc) を使用する場合、インメモリバックアップを除くメーターレジストリは自動構成されません。

統合テストの一環としてメトリクスを別のバックエンドにエクスポートする必要がある場合は、@AutoConfigureMetrics (Javadoc) でアノテーションを付けます。

スライスされたテスト@AutoConfigureMetrics (Javadoc) をアノテーションすると、メモリ内の MeterRegistry (英語) が自動的に構成されます。スライスされたテストでのデータのエクスポートは、@AutoConfigureMetrics (Javadoc) アノテーションではサポートされていません。

トレースの使用

クラスパスに関係なく、@SpringBootTest (Javadoc) を使用する場合、データを報告するトレースコンポーネントは自動的に構成されません。

統合テストの一部としてこれらのコンポーネントが必要な場合は、テストに @AutoConfigureTracing (Javadoc) アノテーションを付けます。

独自のレポートコンポーネント (カスタム SpanExporter (英語) や brave.handler.SpanHandler など) を作成し、テストでアクティブにしたくない場合は、@ConditionalOnEnabledTracingExport (Javadoc) アノテーションを使用して無効にすることができます。

スライスされたテスト@AutoConfigureTracing (Javadoc) をアノテーションすると、no-op Tracer (英語) が自動的に構成されます。スライスされたテストでのデータのエクスポートは、@AutoConfigureTracing (Javadoc) アノテーションではサポートされていません。

Bean のモックとスパイ

テストを実行するとき、アプリケーションコンテキスト内の特定のコンポーネントをモックする必要がある場合があります。例: 開発中は利用できないリモートサービスのファサードがある場合があります。モックは、実際の環境では引き起こしにくい障害をシミュレートする場合にも役立ちます。

Spring Framework には、ApplicationContext (Javadoc) 内の Bean の Mockito モックを定義するために使用できる @MockitoBean (Javadoc) アノテーションが含まれています。さらに、@MockitoSpyBean (Javadoc) を使用して Mockito スパイを定義することもできます。これらの機能の詳細については、Spring Framework ドキュメントを参照してください。

自動構成されたテスト

Spring Boot の自動構成システムは、アプリケーションではうまく機能しますが、テストには少し多すぎる場合があります。多くの場合、アプリケーションの「スライス」をテストするために必要な構成部分のみをロードすると役立ちます。例: Spring MVC コントローラーが URL を正しくマッピングしていることをテストしたい場合があり、それらのテストにデータベース呼び出しを含めたくない場合、または JPA エンティティをテストしたい場合、それらのテストの実行時に Web レイヤーに関心がない場合 .

spring-boot-test-autoconfigure と組み合わせると、Spring Boot のテストモジュールには、このような「スライス」を自動構成するために使用できる複数のアノテーションが含まれます。各アノテーションは同じように動作し、ApplicationContext (Javadoc) をロードする @…​Test アノテーションと、自動構成をカスタマイズするために使用できる 1 つ以上の @AutoConfigure…​ アノテーションを提供します。

各スライスは、コンポーネントスキャンを適切なコンポーネントに制限し、非常に制限された自動構成クラスのセットをロードします。それらのいずれかを除外する必要がある場合、ほとんどの @…​Test アノテーションは excludeAutoConfiguration 属性を提供します。または、@ImportAutoConfiguration#exclude を使用できます。
1 つのテストで複数の @…​Test アノテーションを使用して複数の「スライス」を含めることはサポートされていません。複数の「スライス」が必要な場合は、@…​Test アノテーションの 1 つを選択し、他の「スライス」の @AutoConfigure…​ アノテーションを手動で含めます。
@AutoConfigure…​ アノテーションを標準の @SpringBootTest (Javadoc) アノテーションと一緒に使用することもできます。アプリケーションを「スライス」することに関心がなく、自動構成されたテスト Bean をいくつか使用したい場合は、この組み合わせを使用できます。

自動構成された JSON テスト

オブジェクトの JSON 直列化とデシリアライゼーションが期待どおりに動作していることをテストするには、spring-boot-test-autoconfigure モジュールの @JsonTest (Javadoc) アノテーションを使用できます。@JsonTest (Javadoc) は、サポートされている利用可能な JSON マッパーを自動構成します。これは、以下のいずれかのライブラリになります。

@JsonTest (Javadoc) によって有効になる自動構成のリストは付録に記載されています。

自動構成の要素を構成する必要がある場合は、@AutoConfigureJsonTesters (Javadoc) アノテーションを使用できます。

Spring Boot には、JSONAssert および JsonPath ライブラリと連携して JSON が期待どおりに表示されるかを確認する AssertJ ベースのヘルパーが含まれています。JacksonTester (Javadoc) GsonTester (Javadoc) JsonbTester (Javadoc) BasicJsonTester (Javadoc) クラスは、それぞれ Jackson、Gson、Jsonb、Strings に使用できます。@JsonTest (Javadoc) を使用する場合、テストクラスのヘルパーフィールドは @Autowired (Javadoc) にすることができます。次の例は、Jackson のテストクラスを示しています。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.json.JsonTest;
import org.springframework.boot.test.json.JacksonTester;

import static org.assertj.core.api.Assertions.assertThat;

@JsonTest
class MyJsonTests {

	@Autowired
	private JacksonTester<VehicleDetails> json;

	@Test
	void serialize() throws Exception {
		VehicleDetails details = new VehicleDetails("Honda", "Civic");
		// Assert against a `.json` file in the same package as the test
		assertThat(this.json.write(details)).isEqualToJson("expected.json");
		// Or use JSON path based assertions
		assertThat(this.json.write(details)).hasJsonPathStringValue("@.make");
		assertThat(this.json.write(details)).extractingJsonPathStringValue("@.make").isEqualTo("Honda");
	}

	@Test
	void deserialize() throws Exception {
		String content = "{\"make\":\"Ford\",\"model\":\"Focus\"}";
		assertThat(this.json.parse(content)).isEqualTo(new VehicleDetails("Ford", "Focus"));
		assertThat(this.json.parseObject(content).getMake()).isEqualTo("Ford");
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.json.JsonTest
import org.springframework.boot.test.json.JacksonTester

@JsonTest
class MyJsonTests(@Autowired val json: JacksonTester<VehicleDetails>) {

	@Test
	fun serialize() {
		val details = VehicleDetails("Honda", "Civic")
		// Assert against a `.json` file in the same package as the test
		assertThat(json.write(details)).isEqualToJson("expected.json")
		// Or use JSON path based assertions
		assertThat(json.write(details)).hasJsonPathStringValue("@.make")
		assertThat(json.write(details)).extractingJsonPathStringValue("@.make").isEqualTo("Honda")
	}

	@Test
	fun deserialize() {
		val content = "{\"make\":\"Ford\",\"model\":\"Focus\"}"
		assertThat(json.parse(content)).isEqualTo(VehicleDetails("Ford", "Focus"))
		assertThat(json.parseObject(content).make).isEqualTo("Ford")
	}

}
JSON ヘルパークラスは、標準の単体テストで直接使用することもできます。そのためには、@JsonTest (Javadoc) を使用しない場合は、@BeforeEach (英語) メソッドでヘルパーの initFields メソッドを呼び出します。

Spring Boot の AssertJ ベースのヘルパーを使用して特定の JSON パスの数値をアサートする場合、型によっては isEqualTo を使用できない場合があります。代わりに、AssertJ の satisfies を使用して、値が指定された条件に一致することを表明できます。たとえば、次の例では、実際の数値が 0.01 のオフセット内の 0.15 に近い浮動小数点値であると主張しています。

  • Java

  • Kotlin

	@Test
	void someTest() throws Exception {
		SomeObject value = new SomeObject(0.152f);
		assertThat(this.json.write(value)).extractingJsonPathNumberValue("@.test.numberValue")
			.satisfies((number) -> assertThat(number.floatValue()).isCloseTo(0.15f, within(0.01f)));
	}
	@Test
	fun someTest() {
		val value = SomeObject(0.152f)
		assertThat(json.write(value)).extractingJsonPathNumberValue("@.test.numberValue")
			.satisfies(ThrowingConsumer { number ->
				assertThat(number.toFloat()).isCloseTo(0.15f, within(0.01f))
			})
	}

自動構成された Spring MVC テスト

Spring MVC コントローラーが期待どおりに動作しているかどうかをテストするには、spring-boot-webmvc-test モジュールの @WebMvcTest (Javadoc) アノテーションを使用します。@WebMvcTest (Javadoc) は Spring MVC インフラストラクチャを自動構成し、スキャン対象の Bean を @Controller (Javadoc) @ControllerAdvice (Javadoc) @JacksonComponent (Javadoc) @JsonComponent (Javadoc) (非推奨)、Converter (Javadoc) GenericConverter (Javadoc) Filter (英語) HandlerInterceptor (Javadoc) WebMvcConfigurer (Javadoc) WebMvcRegistrations (Javadoc) HandlerMethodArgumentResolver (Javadoc) に制限します。@WebMvcTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) @ConfigurationProperties (Javadoc) Bean を含めるために使用できます。

@WebMvcTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。
JacksonModule (英語) などの追加コンポーネントを登録する必要がある場合は、テストで @Import (Javadoc) を使用して追加の構成クラスをインポートできます。

多くの場合、@WebMvcTest (Javadoc) は単一のコントローラーに制限されており、必要なコラボレーター向けのモック実装を提供するために @MockitoBean (Javadoc) と組み合わせて使用されます。

@WebMvcTest (Javadoc) MockMvc (Javadoc) も自動構成します。Mock MVC は、完全な HTTP サーバーを起動することなく、MVC コントローラーを迅速にテストできる強力な手段を提供します。AssertJ が利用可能な場合、MockMvcTester (Javadoc) が提供する AssertJ サポートも自動構成されます。テストで RestTestClient (Javadoc) を使用する場合は、テストクラスに @AutoConfigureRestTestClient (Javadoc) アノテーションを付けてください。そうすることで、Mock MVC インフラストラクチャを使用する RestTestClient が自動構成されます。

@WebMvcTest 以外のもの ( @SpringBootTest (Javadoc) など) に @AutoConfigureMockMvc (Javadoc) をアノテーションすることで、MockMvc (Javadoc) MockMvcTester (Javadoc) を自動構成することもできます。次の例では、MockMvcTester (Javadoc) を使用しています。
  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.servlet.assertj.MockMvcTester;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;

@WebMvcTest(UserVehicleController.class)
class MyControllerTests {

	@Autowired
	private MockMvcTester mvc;

	@MockitoBean
	private UserVehicleService userVehicleService;

	@Test
	void testExample() {
		given(this.userVehicleService.getVehicleDetails("sboot"))
			.willReturn(new VehicleDetails("Honda", "Civic"));
		assertThat(this.mvc.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN))
			.hasStatusOk()
			.hasBodyTextEqualTo("Honda Civic");
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.mockito.BDDMockito.given
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest
import org.springframework.http.MediaType
import org.springframework.test.context.bean.override.mockito.MockitoBean
import org.springframework.test.web.servlet.assertj.MockMvcTester

@WebMvcTest(UserVehicleController::class)
class MyControllerTests(@Autowired val mvc: MockMvcTester) {

	@MockitoBean
	lateinit var userVehicleService: UserVehicleService

	@Test
	fun testExample() {
		given(userVehicleService.getVehicleDetails("sboot"))
				.willReturn(VehicleDetails("Honda", "Civic"))
		assertThat(mvc.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN))
				.hasStatusOk().hasBodyTextEqualTo("Honda Civic")
	}

}
自動構成の要素を構成する必要がある場合 (たとえば、サーブレットフィルターを適用する必要がある場合)、@AutoConfigureMockMvc (Javadoc) アノテーションの属性を使用できます。

HtmlUnit と Selenium を使用する場合、自動構成によって HtmlUnit WebClient (Javadoc) Bean および / または Selenium WebDriver (英語) Bean も提供されます。次の例では HtmlUnit を使用しています。

  • Java

  • Kotlin

import org.htmlunit.WebClient;
import org.htmlunit.html.HtmlPage;
import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
import org.springframework.test.context.bean.override.mockito.MockitoBean;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;

@WebMvcTest(UserVehicleController.class)
class MyHtmlUnitTests {

	@Autowired
	private WebClient webClient;

	@MockitoBean
	private UserVehicleService userVehicleService;

	@Test
	void testExample() throws Exception {
		given(this.userVehicleService.getVehicleDetails("sboot")).willReturn(new VehicleDetails("Honda", "Civic"));
		HtmlPage page = this.webClient.getPage("/sboot/vehicle.html");
		assertThat(page.getBody().getTextContent()).isEqualTo("Honda Civic");
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.htmlunit.WebClient
import org.htmlunit.html.HtmlPage
import org.junit.jupiter.api.Test
import org.mockito.BDDMockito.given
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest
import org.springframework.test.context.bean.override.mockito.MockitoBean

@WebMvcTest(UserVehicleController::class)
class MyHtmlUnitTests(@Autowired val webClient: WebClient) {

	@MockitoBean
	lateinit var userVehicleService: UserVehicleService

	@Test
	fun testExample() {
		given(userVehicleService.getVehicleDetails("sboot")).willReturn(VehicleDetails("Honda", "Civic"))
		val page = webClient.getPage<HtmlPage>("/sboot/vehicle.html")
		assertThat(page.body.textContent).isEqualTo("Honda Civic")
	}

}
デフォルトでは、Spring Boot は WebDriver (英語) Bean を特別な「スコープ」に配置して、各テスト後にドライバーが終了し、新しいインスタンスが挿入されるようにします。この動作が不要な場合は、WebDriver (英語) @Bean (Javadoc) 定義に @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) を追加できます。
Spring Boot によって作成された webDriver スコープは、同じ名前のユーザー定義スコープを置き換えます。独自の webDriver スコープを定義した場合、@WebMvcTest (Javadoc) を使用すると動作しなくなることがあります。

クラスパスに Spring Security がある場合、@WebMvcTest (Javadoc) WebSecurityConfigurer (Javadoc) Bean もスキャンします。このようなテストのセキュリティを完全に無効にする代わりに、Spring Security のテストサポートを使用できます。Spring Security の MockMvc (Javadoc) サポートの使用方法の詳細については、この Spring Security を使用したテスト「使い方 ガイド」セクションを参照してください。

Spring MVC テストを作成するだけでは不十分な場合があります。Spring Boot は、実際のサーバーで完全なエンドツーエンドテストを実行できます。

自動構成された Spring WebFlux テスト

Spring WebFlux コントローラーが期待どおりに動作していることをテストするには、spring-boot-webflux-test モジュールの @WebFluxTest (Javadoc) アノテーションを使用できます。@WebFluxTest (Javadoc) は Spring WebFlux インフラストラクチャを自動構成し、スキャン対象の Bean を @Controller (Javadoc) @ControllerAdvice (Javadoc) @JacksonComponent (Javadoc) @JsonComponent (Javadoc) (非推奨)、Converter (Javadoc) GenericConverter (Javadoc) WebFluxConfigurer (Javadoc) に制限します。@WebFluxTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) @ConfigurationProperties (Javadoc) Bean を含めるために使用できます。

@WebFluxTest (Javadoc) によって有効になる自動構成のリストは付録に記載されています。
JacksonModule (英語) などの追加コンポーネントを登録する必要がある場合は、テストで @Import (Javadoc) を使用して追加の構成クラスをインポートできます。

多くの場合、@WebFluxTest (Javadoc) は単一のコントローラーに制限され、必要なコラボレーター向けのモック実装を提供するために @MockitoBean (Javadoc) アノテーションと組み合わせて使用されます。

@WebFluxTest (Javadoc) WebTestClient も自動構成します。これにより、完全な HTTP サーバーを起動しなくても WebFlux コントローラーをすばやくテストできる強力な方法が提供されます。

@AutoConfigureWebTestClient (Javadoc) でアノテーションを付けることで、非 @WebFluxTest ( @SpringBootTest (Javadoc) など) で WebTestClient (Javadoc) を自動構成することもできます。

次の例は、@WebFluxTest (Javadoc) WebTestClient (Javadoc) の両方を使用するクラスを示しています。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webflux.test.autoconfigure.WebFluxTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import org.springframework.test.web.reactive.server.WebTestClient;

import static org.mockito.BDDMockito.given;

@WebFluxTest(UserVehicleController.class)
class MyControllerTests {

	@Autowired
	private WebTestClient webClient;

	@MockitoBean
	private UserVehicleService userVehicleService;

	@Test
	void testExample() {
		given(this.userVehicleService.getVehicleDetails("sboot"))
			.willReturn(new VehicleDetails("Honda", "Civic"));
		this.webClient.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN).exchange()
			.expectStatus().isOk()
			.expectBody(String.class).isEqualTo("Honda Civic");
	}

}
import org.junit.jupiter.api.Test
import org.mockito.BDDMockito.given
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.webflux.test.autoconfigure.WebFluxTest
import org.springframework.http.MediaType
import org.springframework.test.context.bean.override.mockito.MockitoBean
import org.springframework.test.web.reactive.server.WebTestClient
import org.springframework.test.web.reactive.server.expectBody

@WebFluxTest(UserVehicleController::class)
class MyControllerTests(@Autowired val webClient: WebTestClient) {

	@MockitoBean
	lateinit var userVehicleService: UserVehicleService

	@Test
	fun testExample() {
		given(userVehicleService.getVehicleDetails("sboot"))
			.willReturn(VehicleDetails("Honda", "Civic"))
		webClient.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN).exchange()
			.expectStatus().isOk
			.expectBody<String>().isEqualTo("Honda Civic")
	}

}
この設定は、WebFlux アプリケーションでのみサポートされます。モック Web アプリケーションで WebTestClient (Javadoc) を使用すると、現時点では WebFlux でのみ機能します。
@WebFluxTest (Javadoc) は、機能 Web フレームワークを通じて登録されたルートを検出できません。コンテキストで RouterFunction (Javadoc) Bean をテストするには、@Import (Javadoc) を使用するか、@SpringBootTest (Javadoc) を使用して自分で RouterFunction (Javadoc) をインポートすることを検討してください。
@WebFluxTest (Javadoc) は、型 SecurityWebFilterChain (Javadoc) @Bean (Javadoc) として登録されたカスタムセキュリティ構成を検出できません。これをテストに含めるには、@Import (Javadoc) または @SpringBootTest (Javadoc) を使用して Bean を登録する構成をインポートする必要があります。
Spring WebFlux テストを書くだけでは十分でない場合があります。Spring Boot は、実際のサーバーで完全なエンドツーエンドテストを実行するのに役立ちます。

自動構成された Spring GraphQL テスト

Spring GraphQL は、専用のテストサポートモジュールを提供します。プロジェクトに追加する必要があります。

Maven
<dependencies>
	<dependency>
		<groupId>org.springframework.graphql</groupId>
		<artifactId>spring-graphql-test</artifactId>
		<scope>test</scope>
	</dependency>
	<!-- Unless already present in the compile scope -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-webflux</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>
Gradle
dependencies {
	testImplementation("org.springframework.graphql:spring-graphql-test")
	// Unless already present in the implementation configuration
	testImplementation("org.springframework.boot:spring-boot-starter-webflux")
}

このテストモジュールには GraphQlTester が付属しています。このテスターはテストで頻繁に使用されるため、必ず使用方法に慣れておいてください。GraphQlTester (Javadoc) のバリエーションがあり、Spring Boot はテストの種類に応じて自動的に構成します。

Spring Boot は、spring-boot-graphql-test モジュールの @GraphQlTest (Javadoc) アノテーションを使用して Spring GraphQL コントローラーをテストできます。@GraphQlTest (Javadoc) は、トランスポートやサーバーを介さずに Spring GraphQL インフラストラクチャを自動構成します。これにより、スキャン対象となる Bean は @Controller (Javadoc) RuntimeWiringConfigurer (Javadoc) JacksonComponent (Javadoc) @JsonComponent (Javadoc) (非推奨)、Converter (Javadoc) GenericConverter (Javadoc) DataFetcherExceptionResolver (Javadoc) Instrumentation (英語) GraphQlSourceBuilderCustomizer (Javadoc) に制限されます。@GraphQlTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) は、@ConfigurationProperties (Javadoc) Bean を含めるために使用できます。

@GraphQlTest (Javadoc) によって有効になる自動構成のリストは付録に記載されています。

多くの場合、@GraphQlTest (Javadoc) はコントローラーのセットに制限され、必要なコラボレーター向けのモック実装を提供するために @MockitoBean (Javadoc) アノテーションと組み合わせて使用されます。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.docs.web.graphql.runtimewiring.GreetingController;
import org.springframework.boot.graphql.test.autoconfigure.GraphQlTest;
import org.springframework.graphql.test.tester.GraphQlTester;

@GraphQlTest(GreetingController.class)
class GreetingControllerTests {

	@Autowired
	private GraphQlTester graphQlTester;

	@Test
	void shouldGreetWithSpecificName() {
		this.graphQlTester.document("{ greeting(name: \"Alice\") } ")
			.execute()
			.path("greeting")
			.entity(String.class)
			.isEqualTo("Hello, Alice!");
	}

	@Test
	void shouldGreetWithDefaultName() {
		this.graphQlTester.document("{ greeting } ")
			.execute()
			.path("greeting")
			.entity(String.class)
			.isEqualTo("Hello, Spring!");
	}

}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.docs.web.graphql.runtimewiring.GreetingController
import org.springframework.boot.graphql.test.autoconfigure.GraphQlTest
import org.springframework.graphql.test.tester.GraphQlTester

@GraphQlTest(GreetingController::class)
internal class GreetingControllerTests {

	@Autowired
	lateinit var graphQlTester: GraphQlTester

	@Test
	fun shouldGreetWithSpecificName() {
		graphQlTester.document("{ greeting(name: \"Alice\") } ").execute().path("greeting").entity(String::class.java)
				.isEqualTo("Hello, Alice!")
	}

	@Test
	fun shouldGreetWithDefaultName() {
		graphQlTester.document("{ greeting } ").execute().path("greeting").entity(String::class.java)
				.isEqualTo("Hello, Spring!")
	}

}

@SpringBootTest (Javadoc) テストは完全な統合テストであり、アプリケーション全体を対象とします。HttpGraphQlTester (Javadoc) Bean は、spring-boot-graphql-test モジュールの @AutoConfigureHttpGraphQlTester (Javadoc) アノテーションをテストクラスに追加することで追加できます。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.graphql.test.autoconfigure.tester.AutoConfigureHttpGraphQlTester;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.graphql.test.tester.HttpGraphQlTester;

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureHttpGraphQlTester
class GraphQlIntegrationTests {

	@Test
	void shouldGreetWithSpecificName(@Autowired HttpGraphQlTester graphQlTester) {
		HttpGraphQlTester authenticatedTester = graphQlTester.mutate()
			.webTestClient((client) -> client.defaultHeaders((headers) -> headers.setBasicAuth("admin", "ilovespring")))
			.build();
		authenticatedTester.document("{ greeting(name: \"Alice\") } ")
			.execute()
			.path("greeting")
			.entity(String.class)
			.isEqualTo("Hello, Alice!");
	}

}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.graphql.test.autoconfigure.tester.AutoConfigureHttpGraphQlTester
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment
import org.springframework.graphql.test.tester.HttpGraphQlTester
import org.springframework.http.HttpHeaders
import org.springframework.test.web.reactive.server.WebTestClient

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureHttpGraphQlTester
class GraphQlIntegrationTests {

	@Test
	fun shouldGreetWithSpecificName(@Autowired graphQlTester: HttpGraphQlTester) {
		val authenticatedTester = graphQlTester.mutate()
			.webTestClient { client: WebTestClient.Builder ->
				client.defaultHeaders { headers: HttpHeaders ->
					headers.setBasicAuth("admin", "ilovespring")
				}
			}.build()
		authenticatedTester.document("{ greeting(name: \"Alice\") } ").execute()
			.path("greeting").entity(String::class.java).isEqualTo("Hello, Alice!")
	}
}

HttpGraphQlTester (Javadoc) (Bean)は、統合テストの適切なトランスポートを使用します。ランダムポートまたは定義済みポートを使用する場合、テスターはライブサーバーに対して設定されます。テスターを MockMvc にバインドするには、テストクラスに @AutoConfigureMockMvc (Javadoc) アノテーションを必ず追加してください。

自動構成された Data Cassandra テスト

spring-boot-data-cassandra-test モジュールの @DataCassandraTest (Javadoc) を使用して、Data Cassandra アプリケーションをテストできます。デフォルトでは、CassandraTemplate (Javadoc) を構成し、@Table (Javadoc) クラスをスキャンし、Spring Data リポジトリと Cassandra リポジトリを構成します。@DataCassandraTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) を使用して、@ConfigurationProperties (Javadoc) Bean を含めることができます。(Cassandra を Spring Boot と併用する方法の詳細については、Cassandra を参照してください。)

@DataCassandraTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

次の例は、Spring Boot で Cassandra テストを使用するための一般的なセットアップを示しています。

  • Java

  • Kotlin

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.data.cassandra.test.autoconfigure.DataCassandraTest;

@DataCassandraTest
class MyDataCassandraTests {

	@Autowired
	private SomeRepository repository;

}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.data.cassandra.test.autoconfigure.DataCassandraTest

@DataCassandraTest
class MyDataCassandraTests(@Autowired val repository: SomeRepository)

自動構成された Data Couchbase テスト

spring-boot-data-couchbase-test モジュールの @DataCouchbaseTest (Javadoc) を使用して、Data Couchbase アプリケーションをテストできます。デフォルトでは、CouchbaseTemplate (Javadoc) または ReactiveCouchbaseTemplate (Javadoc) を構成し、@Document (Javadoc) クラスをスキャンし、Spring Data リポジトリと Couchbase リポジトリを構成します。@DataCouchbaseTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) を使用して、@ConfigurationProperties (Javadoc) Bean を含めることができます。(Couchbase を Spring Boot と併用する方法の詳細については、この章の前半の Couchbase を参照してください。)

@DataCouchbaseTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

次の例は、Spring Boot で Couchbase テストを使用するための一般的なセットアップを示しています。

  • Java

  • Kotlin

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.data.couchbase.test.autoconfigure.DataCouchbaseTest;

@DataCouchbaseTest
class MyDataCouchbaseTests {

	@Autowired
	private SomeRepository repository;

	// ...

}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.data.couchbase.test.autoconfigure.DataCouchbaseTest

@DataCouchbaseTest
class MyDataCouchbaseTests(@Autowired val repository: SomeRepository) {

	// ...

}

自動構成された Data Elasticsearch テスト

spring-boot-data-elasticsearch-test モジュールの @DataElasticsearchTest (Javadoc) を使用して、Data Elasticsearch アプリケーションをテストできます。デフォルトでは、ElasticsearchTemplate (Javadoc) を構成し、@Document (Javadoc) クラスをスキャンし、Spring Data リポジトリと Elasticsearch リポジトリを構成します。@DataElasticsearchTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) を使用して、@ConfigurationProperties (Javadoc) Bean を含めることができます。(Elasticsearch を Spring Boot と併用する方法の詳細については、この章の前半の Elasticsearch を参照してください。)

@DataElasticsearchTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

次の例は、Spring Boot で Elasticsearch テストを使用するための一般的なセットアップを示しています。

  • Java

  • Kotlin

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.data.elasticsearch.test.autoconfigure.DataElasticsearchTest;

@DataElasticsearchTest
class MyDataElasticsearchTests {

	@Autowired
	private SomeRepository repository;

	// ...

}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.data.elasticsearch.test.autoconfigure.DataElasticsearchTest

@DataElasticsearchTest
class MyDataElasticsearchTests(@Autowired val repository: SomeRepository) {

	// ...

}

自動構成された Data JPA テスト

spring-boot-data-jpa-test モジュールの @DataJpaTest (Javadoc) アノテーションを使用して、Data JPA アプリケーションをテストできます。デフォルトでは、@Entity (英語) クラスをスキャンし、Spring Data JPA リポジトリを設定します。クラスパス上に組み込みデータベースが利用可能な場合は、それも設定します。SQL クエリは、spring.jpa.show-sql プロパティを true に設定すると、デフォルトでログに記録されます。これは、アノテーションの showSql 属性を使用して無効にできます。

@DataJpaTest (Javadoc) アノテーションが使用されている場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) を使用して、@ConfigurationProperties (Javadoc) Bean を含めることができます。

@DataJpaTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

デフォルトでは、Data JPA テストはトランザクションであり、各テストの終了時にロールバックされます。詳細については、Spring Framework リファレンスドキュメントの関連セクションを参照してください。それが望んでいない場合、次のようにテストまたはクラス全体のトランザクション管理を無効にできます。

  • Java

  • Kotlin

import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@DataJpaTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyNonTransactionalTests {

	// ...

}
import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest
import org.springframework.transaction.annotation.Propagation
import org.springframework.transaction.annotation.Transactional

@DataJpaTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyNonTransactionalTests {

	// ...

}

データ JPA テストでは、テスト専用に設計された標準 JPA EntityManager (英語) の代替となる TestEntityManager (Javadoc) Bean を挿入することもできます。

@AutoConfigureTestEntityManager (Javadoc) を追加することで、Spring ベースのテストクラスに TestEntityManager (Javadoc) を自動構成することもできます。これを行うときは、テストクラスまたはメソッドに @Transactional (Javadoc) を追加するなどして、テストがトランザクション内で実行されていることを確認してください。

必要に応じて、JdbcTemplate (Javadoc) も使用できます。次の例は、@DataJpaTest (Javadoc) アノテーションの使用例を示しています。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest;
import org.springframework.boot.jpa.test.autoconfigure.TestEntityManager;

import static org.assertj.core.api.Assertions.assertThat;

@DataJpaTest
class MyRepositoryTests {

	@Autowired
	private TestEntityManager entityManager;

	@Autowired
	private UserRepository repository;

	@Test
	void testExample() {
		this.entityManager.persist(new User("sboot", "1234"));
		User user = this.repository.findByUsername("sboot");
		assertThat(user.getUsername()).isEqualTo("sboot");
		assertThat(user.getEmployeeNumber()).isEqualTo("1234");
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest
import org.springframework.boot.jpa.test.autoconfigure.TestEntityManager

@DataJpaTest
class MyRepositoryTests(@Autowired val entityManager: TestEntityManager, @Autowired val repository: UserRepository) {

	@Test
	fun testExample() {
		entityManager.persist(User("sboot", "1234"))
		val user = repository.findByUsername("sboot")
		assertThat(user?.username).isEqualTo("sboot")
		assertThat(user?.employeeNumber).isEqualTo("1234")
	}

}

メモリ内組み込みデータベースは高速でインストールも不要なので、通常はテストに適しています。ただし、実際のデータベースに対してテストを実行したい場合は、次の例に示すように、@AutoConfigureTestDatabase (Javadoc) アノテーションを使用できます。

  • Java

  • Kotlin

import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest;
import org.springframework.boot.jdbc.test.autoconfigure.AutoConfigureTestDatabase;
import org.springframework.boot.jdbc.test.autoconfigure.AutoConfigureTestDatabase.Replace;

@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
class MyRepositoryTests {

	// ...

}
import org.springframework.boot.jdbc.test.autoconfigure.AutoConfigureTestDatabase
import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class MyRepositoryTests {

	// ...

}

自動構成された JDBC テスト

spring-boot-jdbc-test モジュールの @JdbcTest (Javadoc) @DataJdbcTest (Javadoc) に似ていますが、DataSource (標準 Javadoc) のみを必要とし、Spring Data JDBC を使用しないテスト用です。デフォルトでは、インメモリ組み込みデータベースと JdbcTemplate (Javadoc) を構成します。@JdbcTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) @ConfigurationProperties (Javadoc) Bean を含めるために使用できます。

@JdbcTest (Javadoc) によって有効になる自動構成のリストは付録に記載されています。

デフォルトでは、JDBC テストはトランザクション対応であり、各テストの終わりにロールバックします。詳細については、Spring Framework リファレンスドキュメントの関連セクションを参照してください。それが望んでいない場合は、次のように、テストまたはクラス全体のトランザクション管理を無効にできます。

  • Java

  • Kotlin

import org.springframework.boot.jdbc.test.autoconfigure.JdbcTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@JdbcTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyTransactionalTests {

}
import org.springframework.boot.jdbc.test.autoconfigure.JdbcTest
import org.springframework.transaction.annotation.Propagation
import org.springframework.transaction.annotation.Transactional

@JdbcTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyTransactionalTests

実際のデータベースに対してテストを実行する場合は、@DataJpaTest (Javadoc) と同じように @AutoConfigureTestDatabase (Javadoc) アノテーションを使用できます。( 自動構成された Data JPA テストを参照してください。)

自動構成された Data JDBC テスト

spring-boot-data-jdbc-test モジュールの @DataJdbcTest (Javadoc) @JdbcTest (Javadoc) に似ていますが、Spring Data JDBC リポジトリを使用するテスト用です。デフォルトでは、インメモリ組み込みデータベース、JdbcTemplate (Javadoc) 、Spring Data JDBC リポジトリが構成されます。@DataJdbcTest (Javadoc) アノテーションを使用する場合、AbstractJdbcConfiguration (Javadoc) サブクラスのみがスキャンされ、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) @ConfigurationProperties (Javadoc) Bean を含めるために使用できます。

@DataJdbcTest (Javadoc) によって有効になる自動構成のリストは付録に記載されています。

デフォルトでは、Data JDBC テストはトランザクションであり、各テストの終了時にロールバックされます。詳細については、Spring Framework リファレンスドキュメントの関連セクションを参照してください。それが望んでいない場合、JDBC の例に示すように、テストまたはテストクラス全体のトランザクション管理を無効にすることができます。

実際のデータベースに対してテストを実行する場合は、@DataJpaTest (Javadoc) と同じように @AutoConfigureTestDatabase (Javadoc) アノテーションを使用できます。( 自動構成された Data JPA テストを参照してください。)

自動構成された Data R2DBC テスト

spring-boot-data-r2dbc-test モジュールの @DataR2dbcTest (Javadoc) @DataJdbcTest (Javadoc) に似ていますが、Spring Data R2DBC リポジトリを使用するテスト用です。デフォルトでは、インメモリ組み込みデータベース、R2dbcEntityTemplate (Javadoc) 、Spring Data R2DBC リポジトリが構成されます。@DataR2dbcTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) @ConfigurationProperties (Javadoc) Bean を含めるために使用できます。

@DataR2dbcTest (Javadoc) によって有効になる自動構成のリストは付録に記載されています。

デフォルトでは、データ R2DBC テストはトランザクションではありません。

実際のデータベースに対してテストを実行する場合は、@DataJpaTest (Javadoc) と同じように @AutoConfigureTestDatabase (Javadoc) アノテーションを使用できます。( 自動構成された Data JPA テストを参照してください。)

自動構成された jOOQ テスト

spring-boot-jooq-test の @JooqTest (Javadoc) は、@JdbcTest (Javadoc) と同様に jOOQ 関連のテストに使用できます。jOOQ はデータベーススキーマに対応する Java ベースのスキーマに大きく依存しているため、既存の DataSource (標準 Javadoc) が使用されます。インメモリデータベースに置き換えたい場合は、@AutoConfigureTestDatabase (Javadoc) を使用してこれらの設定をオーバーライドできます。(Spring Boot で jOOQ を使用する方法の詳細については、jOOQ を使用するを参照してください)@JooqTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) @ConfigurationProperties (Javadoc) Bean を含めるために使用できます。

@JooqTest (Javadoc) によって有効になる自動構成のリストは付録に記載されています。

@JooqTest (Javadoc) DSLContext (英語) を構成します。次の例は、使用されている @JooqTest (Javadoc) アノテーションを示しています。

  • Java

  • Kotlin

import org.jooq.DSLContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.jooq.test.autoconfigure.JooqTest;

@JooqTest
class MyJooqTests {

	@Autowired
	private DSLContext dslContext;

	// ...

}
import org.jooq.DSLContext
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.jooq.test.autoconfigure.JooqTest

@JooqTest
class MyJooqTests(@Autowired val dslContext: DSLContext) {

	// ...

}

JOOQ テストはトランザクション対応であり、デフォルトでは各テストの終わりにロールバックします。それが望んでいない場合、JDBC の例に示すように、テストまたはテストクラス全体のトランザクション管理を無効にすることができます。

自動構成された Data MongoDB テスト

spring-boot-data-mongodb-test モジュールの @DataMongoTest (Javadoc) を使用して、MongoDB アプリケーションをテストできます。デフォルトでは、MongoTemplate (Javadoc) を設定し、@Document (Javadoc) クラスをスキャンし、Spring Data MongoDB リポジトリを設定します。@DataMongoTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) を使用して、@ConfigurationProperties (Javadoc) Bean を含めることができます。(Spring Boot での MongoDB の使用の詳細については、MongoDB を参照してください。)

@DataMongoTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

次のクラスは、使用中の @DataMongoTest (Javadoc) アノテーションを示しています。

  • Java

  • Kotlin

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest;
import org.springframework.data.mongodb.core.MongoTemplate;

@DataMongoTest
class MyDataMongoDbTests {

	@Autowired
	private MongoTemplate mongoTemplate;

	// ...

}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest
import org.springframework.data.mongodb.core.MongoTemplate

@DataMongoTest
class MyDataMongoDbTests(@Autowired val mongoTemplate: MongoTemplate) {

	// ...

}

自動構成された Data Neo4j テスト

spring-boot-data-neo4j-test モジュールの @DataNeo4jTest (Javadoc) を使用して、Neo4j アプリケーションをテストできます。デフォルトでは、@Node (Javadoc) クラスをスキャンし、Spring Data Neo4j リポジトリを設定します。@DataNeo4jTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) は、@ConfigurationProperties (Javadoc) Bean を含めるために使用できます。(Spring Boot で Neo4J を使用する方法の詳細については、Neo4j を参照してください。)

@DataNeo4jTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

次の例は、Spring Boot で Neo4J テストを使用するための一般的なセットアップを示しています。

  • Java

  • Kotlin

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.data.neo4j.test.autoconfigure.DataNeo4jTest;

@DataNeo4jTest
class MyDataNeo4jTests {

	@Autowired
	private SomeRepository repository;

	// ...

}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.data.neo4j.test.autoconfigure.DataNeo4jTest

@DataNeo4jTest
class MyDataNeo4jTests(@Autowired val repository: SomeRepository) {

	// ...

}

デフォルトでは、Data Neo4j テストはトランザクション対応であり、各テストの終わりにロールバックします。詳細については、Spring Framework リファレンスドキュメントの関連セクションを参照してください。それが望んでいない場合は、次のように、テストまたはクラス全体のトランザクション管理を無効にできます。

  • Java

  • Kotlin

import org.springframework.boot.data.neo4j.test.autoconfigure.DataNeo4jTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@DataNeo4jTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyDataNeo4jTests {

}
import org.springframework.boot.data.neo4j.test.autoconfigure.DataNeo4jTest
import org.springframework.transaction.annotation.Propagation
import org.springframework.transaction.annotation.Transactional

@DataNeo4jTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyDataNeo4jTests
トランザクションテストは、リアクティブアクセスではサポートされていません。このスタイルを使用する場合は、上記のように @DataNeo4jTest (Javadoc) テストを構成する必要があります。

自動構成された Data Redis テスト

spring-boot-data-redis-test モジュールの @DataRedisTest (Javadoc) を使用して、Data Redis アプリケーションをテストできます。デフォルトでは、@RedisHash (Javadoc) クラスをスキャンし、Spring Data リポジトリと Redis リポジトリを構成します。@DataRedisTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) を使用して、@ConfigurationProperties (Javadoc) Bean を組み込むことができます。(Redis を Spring Boot と併用する方法の詳細については、Redis を参照してください。)

@DataRedisTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

次の例は、@DataRedisTest (Javadoc) アノテーションの使用例を示しています。

  • Java

  • Kotlin

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.data.redis.test.autoconfigure.DataRedisTest;

@DataRedisTest
class MyDataRedisTests {

	@Autowired
	private SomeRepository repository;

	// ...

}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.data.redis.test.autoconfigure.DataRedisTest

@DataRedisTest
class MyDataRedisTests(@Autowired val repository: SomeRepository) {

	// ...

}

自動構成された Data LDAP テスト

@DataLdapTest (Javadoc) を使用して Data LDAP アプリケーションをテストできます。デフォルトでは、メモリ内組み込み LDAP(利用可能な場合)の設定、LdapTemplate (Javadoc) の設定、@Entry (Javadoc) クラスのスキャン、Spring Data LDAP リポジトリの設定が行われます。@DataLdapTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) @ConfigurationProperties (Javadoc) Bean を含めるために使用できます。(Spring Boot での LDAP の使用の詳細については、LDAP を参照してください。)

@DataLdapTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

次の例は、@DataLdapTest (Javadoc) アノテーションの使用例を示しています。

  • Java

  • Kotlin

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.data.ldap.test.autoconfigure.DataLdapTest;
import org.springframework.ldap.core.LdapTemplate;

@DataLdapTest
class MyDataLdapTests {

	@Autowired
	private LdapTemplate ldapTemplate;

	// ...

}
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.data.ldap.test.autoconfigure.DataLdapTest
import org.springframework.ldap.core.LdapTemplate

@DataLdapTest
class MyDataLdapTests(@Autowired val ldapTemplate: LdapTemplate) {

	// ...

}

メモリ内の組み込み LDAP は、高速であり、開発者がインストールする必要がないため、一般にテストに適しています。ただし、実際の LDAP サーバーに対してテストを実行する場合は、次の例に示すように、組み込みの LDAP 自動構成を除外する必要があります。

  • Java

  • Kotlin

import org.springframework.boot.data.ldap.test.autoconfigure.DataLdapTest;
import org.springframework.boot.ldap.autoconfigure.embedded.EmbeddedLdapAutoConfiguration;

@DataLdapTest(excludeAutoConfiguration = EmbeddedLdapAutoConfiguration.class)
class MyDataLdapTests {

	// ...

}
import org.springframework.boot.ldap.autoconfigure.embedded.EmbeddedLdapAutoConfiguration
import org.springframework.boot.data.ldap.test.autoconfigure.DataLdapTest

@DataLdapTest(excludeAutoConfiguration = [EmbeddedLdapAutoConfiguration::class])
class MyDataLdapTests {

	// ...

}

自動構成された REST クライアント

spring-boot-restclient-test モジュールの @RestClientTest (Javadoc) アノテーションを使用して、REST クライアントをテストできます。デフォルトでは、Jackson、GSON、Jsonb のサポートが自動構成され、RestTemplateBuilder (Javadoc) RestClient.Builder (Javadoc) が設定され、MockRestServiceServer (Javadoc) のサポートが追加されます。@RestClientTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) @ConfigurationProperties (Javadoc) Bean を含めるために使用できます。

@RestClientTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

テストする特定の Bean は、@RestClientTest (Javadoc) の value または components 属性を使用して指定する必要があります。

テスト対象の Bean で RestTemplateBuilder (Javadoc) を使用し、RestTemplate (Javadoc) の構築時に RestTemplateBuilder.rootUri(String rootUri) が呼び出された場合は、次の例に示すように、MockRestServiceServer (Javadoc) の期待値からルート URI を省略する必要があります。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.restclient.test.autoconfigure.RestClientTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.client.MockRestServiceServer;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;

@RestClientTest(org.springframework.boot.docs.testing.springbootapplications.autoconfiguredrestclient.RemoteVehicleDetailsService.class)
class MyRestTemplateServiceTests {

	@Autowired
	private RemoteVehicleDetailsService service;

	@Autowired
	private MockRestServiceServer server;

	@Test
	void getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() {
		this.server.expect(requestTo("/greet/details")).andRespond(withSuccess("hello", MediaType.TEXT_PLAIN));
		String greeting = this.service.callRestService();
		assertThat(greeting).isEqualTo("hello");
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.restclient.test.autoconfigure.RestClientTest
import org.springframework.http.MediaType
import org.springframework.test.web.client.MockRestServiceServer
import org.springframework.test.web.client.match.MockRestRequestMatchers
import org.springframework.test.web.client.response.MockRestResponseCreators

@RestClientTest(RemoteVehicleDetailsService::class)
class MyRestTemplateServiceTests(
	@Autowired val service: RemoteVehicleDetailsService,
	@Autowired val server: MockRestServiceServer) {

	@Test
	fun getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() {
		server.expect(MockRestRequestMatchers.requestTo("/greet/details"))
			.andRespond(MockRestResponseCreators.withSuccess("hello", MediaType.TEXT_PLAIN))
		val greeting = service.callRestService()
		assertThat(greeting).isEqualTo("hello")
	}

}

テスト対象の Bean で RestClient.Builder (Javadoc) を使用する場合、または rootUri(String rootURI) を呼び出さずに RestTemplateBuilder (Javadoc) を使用する場合は、次の例に示すように、MockRestServiceServer (Javadoc) の期待値で完全な URI を使用する必要があります。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.restclient.test.autoconfigure.RestClientTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.client.MockRestServiceServer;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;

@RestClientTest(RemoteVehicleDetailsService.class)
class MyRestClientServiceTests {

	@Autowired
	private RemoteVehicleDetailsService service;

	@Autowired
	private MockRestServiceServer server;

	@Test
	void getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() {
		this.server.expect(requestTo("https://example.com/greet/details"))
			.andRespond(withSuccess("hello", MediaType.TEXT_PLAIN));
		String greeting = this.service.callRestService();
		assertThat(greeting).isEqualTo("hello");
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.restclient.test.autoconfigure.RestClientTest
import org.springframework.http.MediaType
import org.springframework.test.web.client.MockRestServiceServer
import org.springframework.test.web.client.match.MockRestRequestMatchers
import org.springframework.test.web.client.response.MockRestResponseCreators

@RestClientTest(RemoteVehicleDetailsService::class)
class MyRestClientServiceTests(
	@Autowired val service: RemoteVehicleDetailsService,
	@Autowired val server: MockRestServiceServer) {

	@Test
	fun getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() {
		server.expect(MockRestRequestMatchers.requestTo("https://example.com/greet/details"))
			.andRespond(MockRestResponseCreators.withSuccess("hello", MediaType.TEXT_PLAIN))
		val greeting = service.callRestService()
		assertThat(greeting).isEqualTo("hello")
	}

}

自動構成された Web クライアント

spring-boot-webclient-test モジュールの @WebClientTest (Javadoc) アノテーションを使用して、WebClient を使用するコードをテストできます。デフォルトでは、Jackson、GSON、Jsonb のサポートが自動構成され、WebClient.Builder (Javadoc) が構成されます。@WebClientTest (Javadoc) アノテーションを使用する場合、通常の @Component (Javadoc) および @ConfigurationProperties (Javadoc) Bean はスキャンされません。@EnableConfigurationProperties (Javadoc) @ConfigurationProperties (Javadoc) Bean を含めるために使用できます。

@WebClientTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

テストする特定の Bean は、@WebClientTest (Javadoc) の value または components 属性を使用して指定する必要があります。

自動構成された Spring REST Docs テスト

`spring-boot-restdocs- モジュールの @AutoConfigureRestDocs (Javadoc) アノテーションを使用すると、Mock MVC または WebTestClient を使用したテストで Spring REST Docs を使用できます。これにより、Spring REST Docs の JUnit 拡張機能が不要になります。

@AutoConfigureRestDocs (Javadoc) は、デフォルトの出力ディレクトリ (Maven を使用している場合は target/generated-snippets、Gradle を使用している場合は build/generated-snippets ) をオーバーライドするために使用できます。また、ドキュメント化された URI に表示されるホスト、スキーム、ポートを構成するためにも使用できます。

モック MVC を使用した自動構成 Spring REST Docs テスト

@AutoConfigureRestDocs (Javadoc) は、サーブレットベースの Web アプリケーションをテストするときに Spring REST Docs を使用するように MockMvc (Javadoc) Bean をカスタマイズします。次の例に示すように、@Autowired (Javadoc) を使用してこれを挿入し、Mock MVC と Spring REST Docs を使用する場合と同じようにテストで使用できます。

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.restdocs.test.autoconfigure.AutoConfigureRestDocs;
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.assertj.MockMvcTester;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;

@WebMvcTest(UserController.class)
@AutoConfigureRestDocs
class MyUserDocumentationTests {

	@Autowired
	private MockMvcTester mvc;

	@Test
	void listUsers() {
		assertThat(this.mvc.get().uri("/users").accept(MediaType.TEXT_PLAIN)).hasStatusOk()
			.apply(document("list-users"));
	}

}

AssertJ 統合を使用する場合は、次の例に示すように、MockMvcTester (Javadoc) も使用できます。

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.restdocs.test.autoconfigure.AutoConfigureRestDocs;
import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.assertj.MockMvcTester;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;

@WebMvcTest(UserController.class)
@AutoConfigureRestDocs
class MyUserDocumentationTests {

	@Autowired
	private MockMvcTester mvc;

	@Test
	void listUsers() {
		assertThat(this.mvc.get().uri("/users").accept(MediaType.TEXT_PLAIN)).hasStatusOk()
			.apply(document("list-users"));
	}

}

どちらもバックグラウンドで同じ MockMvc (Javadoc) インスタンスを再利用するため、そのインスタンスに対する構成は両方に適用されます。

@AutoConfigureRestDocs (Javadoc) の属性で提供されるよりも高度な Spring REST Docs 構成の制御が必要な場合は、次の例に示すように、RestDocsMockMvcConfigurationCustomizer (Javadoc) Bean を使用できます。

  • Java

  • Kotlin

import org.springframework.boot.restdocs.test.autoconfigure.RestDocsMockMvcConfigurationCustomizer;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer;
import org.springframework.restdocs.templates.TemplateFormats;

@TestConfiguration(proxyBeanMethods = false)
public class MyRestDocsConfiguration implements RestDocsMockMvcConfigurationCustomizer {

	@Override
	public void customize(MockMvcRestDocumentationConfigurer configurer) {
		configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
	}

}
import org.springframework.boot.restdocs.test.autoconfigure.RestDocsMockMvcConfigurationCustomizer
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer
import org.springframework.restdocs.templates.TemplateFormats

@TestConfiguration(proxyBeanMethods = false)
class MyRestDocsConfiguration : RestDocsMockMvcConfigurationCustomizer {

	override fun customize(configurer: MockMvcRestDocumentationConfigurer) {
		configurer.snippets().withTemplateFormat(TemplateFormats.markdown())
	}

}

パラメーター化された出力ディレクトリの Spring REST Docs サポートを利用する場合は、RestDocumentationResultHandler (Javadoc) Bean を作成できます。自動構成では、この結果ハンドラーを使用して alwaysDo を呼び出し、各 MockMvc (Javadoc) 呼び出しでデフォルトのスニペットが自動的に生成されます。次の例は、RestDocumentationResultHandler (Javadoc) が定義されていることを示しています。

  • Java

  • Kotlin

import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation;
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler;

@TestConfiguration(proxyBeanMethods = false)
public class MyResultHandlerConfiguration {

	@Bean
	public RestDocumentationResultHandler restDocumentation() {
		return MockMvcRestDocumentation.document("{method-name}");
	}

}
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.context.annotation.Bean
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler

@TestConfiguration(proxyBeanMethods = false)
class MyResultHandlerConfiguration {

	@Bean
	fun restDocumentation(): RestDocumentationResultHandler {
		return MockMvcRestDocumentation.document("{method-name}")
	}

}

WebTestClient を使用した自動構成 Spring REST Docs テスト

@AutoConfigureRestDocs (Javadoc) は、リアクティブ Web アプリケーションをテストするときに、WebTestClient (Javadoc) と一緒に使用することもできます。次の例に示すように、@Autowired (Javadoc) を使用してこれを挿入し、@WebFluxTest (Javadoc) と Spring REST Docs を使用する場合と同じようにテストで使用できます。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.restdocs.test.autoconfigure.AutoConfigureRestDocs;
import org.springframework.boot.webflux.test.autoconfigure.WebFluxTest;
import org.springframework.test.web.reactive.server.WebTestClient;

import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document;

@WebFluxTest
@AutoConfigureRestDocs
class MyUsersDocumentationTests {

	@Autowired
	private WebTestClient webTestClient;

	@Test
	void listUsers() {
		this.webTestClient
			.get().uri("/")
		.exchange()
		.expectStatus()
			.isOk()
		.expectBody()
			.consumeWith(document("list-users"));
	}

}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.restdocs.test.autoconfigure.AutoConfigureRestDocs
import org.springframework.boot.webflux.test.autoconfigure.WebFluxTest
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation
import org.springframework.test.web.reactive.server.WebTestClient

@WebFluxTest
@AutoConfigureRestDocs
class MyUsersDocumentationTests(@Autowired val webTestClient: WebTestClient) {

	@Test
	fun listUsers() {
		webTestClient
			.get().uri("/")
			.exchange()
			.expectStatus()
			.isOk
			.expectBody()
			.consumeWith(WebTestClientRestDocumentation.document("list-users"))
	}

}

@AutoConfigureRestDocs (Javadoc) の属性で提供されるよりも高度な Spring REST Docs 構成の制御が必要な場合は、次の例に示すように、RestDocsWebTestClientConfigurationCustomizer (Javadoc) Bean を使用できます。

  • Java

  • Kotlin

import org.springframework.boot.restdocs.test.autoconfigure.RestDocsWebTestClientConfigurationCustomizer;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentationConfigurer;

@TestConfiguration(proxyBeanMethods = false)
public class MyRestDocsConfiguration implements RestDocsWebTestClientConfigurationCustomizer {

	@Override
	public void customize(WebTestClientRestDocumentationConfigurer configurer) {
		configurer.snippets().withEncoding("UTF-8");
	}

}
import org.springframework.boot.restdocs.test.autoconfigure.RestDocsWebTestClientConfigurationCustomizer
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentationConfigurer

@TestConfiguration(proxyBeanMethods = false)
class MyRestDocsConfiguration : RestDocsWebTestClientConfigurationCustomizer {

	override fun customize(configurer: WebTestClientRestDocumentationConfigurer) {
		configurer.snippets().withEncoding("UTF-8")
	}

}

パラメーター化された出力ディレクトリの Spring REST Docs サポートを利用する場合は、WebTestClientBuilderCustomizer (Javadoc) を使用して、すべてのエンティティ交換結果のコンシューマーを構成できます。次の例は、このような WebTestClientBuilderCustomizer (Javadoc) の定義を示しています。

  • Java

  • Kotlin

import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.webtestclient.autoconfigure.WebTestClientBuilderCustomizer;
import org.springframework.context.annotation.Bean;

import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document;

@TestConfiguration(proxyBeanMethods = false)
public class MyWebTestClientBuilderCustomizerConfiguration {

	@Bean
	public WebTestClientBuilderCustomizer restDocumentation() {
		return (builder) -> builder.entityExchangeResultConsumer(document("{method-name}"));
	}

}
import org.springframework.boot.test.context.TestConfiguration
import org.springframework.boot.webtestclient.autoconfigure.WebTestClientBuilderCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation
import org.springframework.test.web.reactive.server.WebTestClient

@TestConfiguration(proxyBeanMethods = false)
class MyWebTestClientBuilderCustomizerConfiguration {

	@Bean
	fun restDocumentation(): WebTestClientBuilderCustomizer {
		return WebTestClientBuilderCustomizer { builder: WebTestClient.Builder ->
			builder.entityExchangeResultConsumer(
				WebTestClientRestDocumentation.document("{method-name}")
			)
		}
	}

}

自動構成された Spring Web Services テスト

自動構成された Spring Web Services クライアントテスト

spring-boot-webservices-test モジュールの @WebServiceClientTest (Javadoc) を使用すると、Spring Web Services プロジェクトを使用して Web サービスを呼び出すアプリケーションをテストできます。デフォルトでは、MockWebServiceServer (Javadoc) Bean が設定され、WebServiceTemplateBuilder (Javadoc) が自動的にカスタマイズされます。(Spring Boot での Web サービスの使用の詳細については、Web サービスを参照してください。)

@WebServiceClientTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

次の例は、@WebServiceClientTest (Javadoc) アノテーションの使用例を示しています。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webservices.test.autoconfigure.client.WebServiceClientTest;
import org.springframework.ws.test.client.MockWebServiceServer;
import org.springframework.xml.transform.StringSource;

import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.ws.test.client.RequestMatchers.payload;
import static org.springframework.ws.test.client.ResponseCreators.withPayload;

@WebServiceClientTest(SomeWebService.class)
class MyWebServiceClientTests {

	@Autowired
	private MockWebServiceServer server;

	@Autowired
	private SomeWebService someWebService;

	@Test
	void mockServerCall() {
		this.server
			.expect(payload(new StringSource("<request/>")))
			.andRespond(withPayload(new StringSource("<response><status>200</status></response>")));
		assertThat(this.someWebService.test())
			.extracting(Response::getStatus)
			.isEqualTo(200);
	}

}
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.webservices.test.autoconfigure.client.WebServiceClientTest
import org.springframework.ws.test.client.MockWebServiceServer
import org.springframework.ws.test.client.RequestMatchers
import org.springframework.ws.test.client.ResponseCreators
import org.springframework.xml.transform.StringSource

@WebServiceClientTest(SomeWebService::class)
class MyWebServiceClientTests(
		@Autowired val server: MockWebServiceServer, @Autowired val someWebService: SomeWebService) {

	@Test
	fun mockServerCall() {
		server
			.expect(RequestMatchers.payload(StringSource("<request/>")))
			.andRespond(ResponseCreators.withPayload(StringSource("<response><status>200</status></response>")))
		assertThat(this.someWebService.test()).extracting(Response::status).isEqualTo(200)
	}

}

自動構成された Spring Web Services サーバーテスト

spring-boot-webservices-test モジュールの @WebServiceServerTest (Javadoc) を使用すると、Spring Web Services プロジェクトを使用して Web サービスを実装したアプリケーションをテストできます。デフォルトでは、Web サービスのエンドポイントを呼び出すために使用できる MockWebServiceClient (Javadoc) Bean が構成されます。(Spring Boot での Web サービスの使用の詳細については、Web サービスを参照してください。)

@WebServiceServerTest (Javadoc) によって有効になる自動構成設定のリストは、付録に記載されています。

次の例は、@WebServiceServerTest (Javadoc) アノテーションの使用例を示しています。

  • Java

  • Kotlin

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webservices.test.autoconfigure.server.WebServiceServerTest;
import org.springframework.ws.test.server.MockWebServiceClient;
import org.springframework.ws.test.server.RequestCreators;
import org.springframework.ws.test.server.ResponseMatchers;
import org.springframework.xml.transform.StringSource;

@WebServiceServerTest(ExampleEndpoint.class)
class MyWebServiceServerTests {

	@Autowired
	private MockWebServiceClient client;

	@Test
	void mockServerCall() {
		this.client
			.sendRequest(RequestCreators.withPayload(new StringSource("<ExampleRequest/>")))
			.andExpect(ResponseMatchers.payload(new StringSource("<ExampleResponse>42</ExampleResponse>")));
	}

}
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.webservices.test.autoconfigure.server.WebServiceServerTest
import org.springframework.ws.test.server.MockWebServiceClient
import org.springframework.ws.test.server.RequestCreators
import org.springframework.ws.test.server.ResponseMatchers
import org.springframework.xml.transform.StringSource

@WebServiceServerTest(ExampleEndpoint::class)
class MyWebServiceServerTests(@Autowired val client: MockWebServiceClient) {

	@Test
	fun mockServerCall() {
		client
			.sendRequest(RequestCreators.withPayload(StringSource("<ExampleRequest/>")))
			.andExpect(ResponseMatchers.payload(StringSource("<ExampleResponse>42</ExampleResponse>")))
	}

}

追加の自動構成とスライス

各スライスには、スライスの一部として含める必要がある自動構成を定義する 1 つ以上の @AutoConfigure…​ アノテーションが用意されています。追加の自動構成は、カスタム @AutoConfigure…​ アノテーションを作成するか、次の例に示すようにテストに @ImportAutoConfiguration (Javadoc) を追加することで、テストごとに追加できます。

  • Java

  • Kotlin

import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.integration.autoconfigure.IntegrationAutoConfiguration;
import org.springframework.boot.jdbc.test.autoconfigure.JdbcTest;

@JdbcTest
@ImportAutoConfiguration(IntegrationAutoConfiguration.class)
class MyJdbcTests {

}
import org.springframework.boot.autoconfigure.ImportAutoConfiguration
import org.springframework.boot.integration.autoconfigure.IntegrationAutoConfiguration
import org.springframework.boot.jdbc.test.autoconfigure.JdbcTest

@JdbcTest
@ImportAutoConfiguration(IntegrationAutoConfiguration::class)
class MyJdbcTests
自動構成は Spring Boot によって特定の方法で処理されるため、自動構成をインポートする際に通常の @Import (Javadoc) アノテーションを使用しないでください。

または、次の例に示すように、META-INF/spring に保存されているファイルにスライスアノテーションを登録することにより、スライスアノテーションを使用するための自動構成を追加できます。

META-INF/Spring/org.springframework.boot.jdbc.test.autoconfigure.JdbcTest.imports
com.example.IntegrationAutoConfiguration

この例では、@JdbcTest (Javadoc) でアノテーションが付けられたすべてのテストで com.example.IntegrationAutoConfiguration が有効になっています。

このファイルでは、# でコメントを使用できます。
スライスまたは @AutoConfigure…​ アノテーションは、@ImportAutoConfiguration (Javadoc) でメタアノテーションされている限り、この方法でカスタマイズできます。

ユーザー設定とスライス

その場合、アプリケーションのメインクラスに、その機能の特定の領域に固有の構成設定を散らかさないことが重要になります。

Spring Data MongoDB を使用しており、自動構成に依存しており、監査を有効にしていると仮定します。次のように @SpringBootApplication (Javadoc) を定義できます。

  • Java

  • Kotlin

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.mongodb.config.EnableMongoAuditing;

@SpringBootApplication
@EnableMongoAuditing
public class MyApplication {

	// ...

}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.data.mongodb.config.EnableMongoAuditing

@SpringBootApplication
@EnableMongoAuditing
class MyApplication {

	// ...

}

このクラスはテストのソース構成であるため、スライステストは実際に Mongo 監査を有効にしようとしますが、これは絶対に望ましいことではありません。推奨されるアプローチは、次の例に示すように、その領域固有の構成をアプリケーションと同じレベルの別の @Configuration (Javadoc) クラスに移動することです。

  • Java

  • Kotlin

import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.EnableMongoAuditing;

@Configuration(proxyBeanMethods = false)
@EnableMongoAuditing
public class MyMongoConfiguration {

	// ...

}
import org.springframework.context.annotation.Configuration
import org.springframework.data.mongodb.config.EnableMongoAuditing

@Configuration(proxyBeanMethods = false)
@EnableMongoAuditing
class MyMongoConfiguration {

	// ...

}
アプリケーションの複雑さに応じて、カスタマイズ用に 1 つの @Configuration (Javadoc) クラスを使用するか、ドメイン領域ごとに 1 つのクラスを使用するかのいずれかになります。後者のアプローチでは、必要に応じて、@Import (Javadoc) アノテーションを使用して、テストの 1 つでそれを有効にすることができます。スライステストで特定の @Configuration (Javadoc) クラスを有効にする必要がある状況の詳細については、この使い方 セクションを参照してください。

テストスライスは、@Configuration (Javadoc) クラスをスキャンから除外します。例: @WebMvcTest (Javadoc) の場合、次の構成では、テストスライスによってロードされるアプリケーションコンテキストに指定された WebMvcConfigurer (Javadoc) Bean が含まれません。

  • Java

  • Kotlin

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration(proxyBeanMethods = false)
public class MyWebConfiguration {

	@Bean
	public WebMvcConfigurer testConfigurer() {
		return new WebMvcConfigurer() {
			// ...
		};
	}

}
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer

@Configuration(proxyBeanMethods = false)
class MyWebConfiguration {

	@Bean
	fun testConfigurer(): WebMvcConfigurer {
		return object : WebMvcConfigurer {
			// ...
		}
	}

}

ただし、以下の構成では、カスタム WebMvcConfigurer (Javadoc) がテストスライスによってロードされます。

  • Java

  • Kotlin

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Component
public class MyWebMvcConfigurer implements WebMvcConfigurer {

	// ...

}
import org.springframework.stereotype.Component
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer

@Component
class MyWebMvcConfigurer : WebMvcConfigurer {

	// ...

}

混乱のもう 1 つの原因は、クラスパススキャンです。実用的な方法でコードを構造化しながら、追加のパッケージをスキャンする必要があると仮定します。アプリケーションは次のコードのようになります。

  • Java

  • Kotlin

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({ "com.example.app", "com.example.another" })
public class MyApplication {

	// ...

}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.context.annotation.ComponentScan

@SpringBootApplication
@ComponentScan("com.example.app", "com.example.another")
class MyApplication {

	// ...

}

これを行うと、デフォルトのコンポーネントスキャンディレクティブが実質的に上書きされ、選択したスライスに関係なく、これら 2 つのパッケージがスキャンされるという副作用が発生します。たとえば、@DataJpaTest (Javadoc) は突然、アプリケーションのコンポーネントとユーザー構成をスキャンするようです。この場合も、カスタムディレクティブを別のクラスに移動すると、この課題を解決できます。

これがオプションでない場合は、テストの階層のどこかに @SpringBootConfiguration (Javadoc) を作成して、代わりにそれを使用するようにすることができます。または、テストのソースを指定して、デフォルトのソースを検索する動作を無効にすることもできます。