セットアップの選択

MockMvc は 2 つの方法のいずれかでセットアップできます。1 つは、テストするコントローラーを直接指定し、プログラムで Spring MVC インフラストラクチャを構成する方法です。2 つ目は、Spring MVC とコントローラーインフラストラクチャを含む Spring 構成を指すことです。

特定のコントローラーをテストするために MockMvc をセットアップするには、以下を使用します。

  • Java

  • Kotlin

class MyWebTests {

	MockMvc mockMvc;

	@BeforeEach
	void setup() {
		this.mockMvc = MockMvcBuilders.standaloneSetup(new AccountController()).build();
	}

	// ...

}
class MyWebTests {

	lateinit var mockMvc : MockMvc

	@BeforeEach
	fun setup() {
		mockMvc = MockMvcBuilders.standaloneSetup(AccountController()).build()
	}

	// ...

}

または、上記と同じビルダーに委譲する WebTestClient を介してテストするときに、このセットアップを使用することもできます。

Spring 構成を介して MockMvc をセットアップするには、以下を使用します。

  • Java

  • Kotlin

@SpringJUnitWebConfig(locations = "my-servlet-context.xml")
class MyWebTests {

	MockMvc mockMvc;

	@BeforeEach
	void setup(WebApplicationContext wac) {
		this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
	}

	// ...

}
@SpringJUnitWebConfig(locations = ["my-servlet-context.xml"])
class MyWebTests {

	lateinit var mockMvc: MockMvc

	@BeforeEach
	fun setup(wac: WebApplicationContext) {
		mockMvc = MockMvcBuilders.webAppContextSetup(wac).build()
	}

	// ...

}

または、上記と同じビルダーに委譲する WebTestClient を介してテストするときに、このセットアップを使用することもできます。

どのセットアップオプションを使用する必要がありますか?

webAppContextSetup は実際の Spring MVC 構成をロードし、より完全な統合テストを行います。TestContext フレームワークはロードされた Spring 構成をキャッシュするため、テストスイートにさらに多くのテストを導入しても、テストを高速に実行し続けるのに役立ちます。さらに、Spring 構成を介してモックサービスをコントローラーに挿入して、Web レイヤーのテストに集中することができます。次の例では、Mockito を使用してモックサービスを宣言しています。

<bean id="accountService" class="org.mockito.Mockito" factory-method="mock">
	<constructor-arg type="java.lang.Class" value="org.example.AccountService"/>
	<constructor-arg type="java.lang.String" value="accountService"/>
</bean>

次に、次の例に示すように、モックサービスをテストに挿入して、期待を設定および検証できます。

  • Java

  • Kotlin

@SpringJUnitWebConfig(locations = "test-servlet-context.xml")
class AccountTests {

	@Autowired
	AccountService accountService;

	MockMvc mockMvc;

	@BeforeEach
	void setup(WebApplicationContext wac) {
		this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
	}

	// ...

}
@SpringJUnitWebConfig(locations = ["test-servlet-context.xml"])
class AccountTests {

	@Autowired
	lateinit var accountService: AccountService

	lateinit var mockMvc: MockMvc

	@BeforeEach
	fun setup(wac: WebApplicationContext) {
		mockMvc = MockMvcBuilders.webAppContextSetup(wac).build()
	}

	// ...

}

一方、standaloneSetup は、ユニットテストに少し近いです。一度に 1 つのコントローラーをテストします。モックの依存関係を持つコントローラーを手動で挿入でき、Spring 構成のロードは含まれません。このようなテストはスタイルに重点を置いており、どのコントローラーがテストされているか、特定の Spring MVC 構成が機能する必要があるかどうかなどを簡単に確認できます。standaloneSetup は、特定の動作を検証したり、課題をデバッグしたりするためのアドホックテストを作成するための非常に便利な方法でもあります。

ほとんどの「統合と単体テスト」の議論と同様に、正しい答えも間違った答えもありません。ただし、standaloneSetup を使用すると、Spring MVC 構成を検証するために追加の webAppContextSetup テストが必要になることを意味します。または、実際の Spring MVC 構成に対して常にテストするために、webAppContextSetup を使用してすべてのテストを作成できます。