对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

设置选项

MockMvc 可以通过两种方式之一进行设置。一种是直接指向你要测试的控制器,并以编程方式配置 Spring MVC 基础设施。另一种是指向包含 Spring MVC 和控制器基础设施的 Spring 配置。spring-doc.cadn.net.cn

要为测试特定控制器设置 MockMvc,请使用以下方法:spring-doc.cadn.net.cn

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-doc.cadn.net.cn

要通过 Spring 配置设置 MockMvc,请使用以下方式:spring-doc.cadn.net.cn

@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 进行测试时使用此配置,它会委托给与上述相同的构建器。spring-doc.cadn.net.cn

应使用哪种设置选项?spring-doc.cadn.net.cn

webAppContextSetup 会加载你实际的 Spring MVC 配置,从而实现更完整的集成测试。由于 TestContext 框架会对已加载的 Spring 配置进行缓存,即使你在测试套件中不断增加更多测试,也能帮助保持测试的快速运行。此外,你可以通过 Spring 配置将模拟服务注入到控制器中,以便专注于测试 Web 层。以下示例使用 Mockito 声明了一个模拟服务:spring-doc.cadn.net.cn

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

然后,您可以将模拟服务注入到测试中,以设置和验证您的预期行为,如下例所示:spring-doc.cadn.net.cn

@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 更接近于单元测试。它一次只测试一个控制器。你可以手动将控制器注入模拟的依赖项,并且不会加载 Spring 配置。这类测试风格更加聚焦,能更清晰地看出正在测试的是哪个控制器、是否需要特定的 Spring MVC 配置才能正常工作等等。standaloneSetup 也是编写临时测试以验证特定行为或调试问题的一种非常便捷的方式。spring-doc.cadn.net.cn

与大多数“集成测试与单元测试”的争论一样,这里并没有绝对正确或错误的答案。然而,使用 standaloneSetup 确实意味着你需要额外编写基于 webAppContextSetup 的测试,以验证你的 Spring MVC 配置。或者,你也可以全部使用 webAppContextSetup 编写测试,以便始终针对你实际的 Spring MVC 配置进行测试。spring-doc.cadn.net.cn