对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cn

设置选项

可以通过以下两种方式之一设置 MockMvc。一种是直接指向 想要测试和以编程方式配置 Spring MVC 基础设施。第二个是 指向其中包含 Spring MVC 和控制器基础结构的 Spring 配置。spring-doc.cn

要设置 MockMvc 以测试特定控制器,请使用以下内容:spring-doc.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.cn

要通过 Spring 配置设置 MockMvc,请使用以下内容:spring-doc.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.cn

您应该使用哪个设置选项?spring-doc.cn

这会加载您的实际 Spring MVC 配置,从而产生一个 完成集成测试。由于 TestContext 框架缓存了加载的 Spring 配置中,它有助于保持测试快速运行,即使您在 测试套件。此外,你可以通过 Spring 将 mock 服务注入控制器 配置以继续专注于测试 Web 层。以下示例声明 带有 Mockito 的 mock 服务:webAppContextSetupspring-doc.cn

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

然后,您可以将 mock 服务注入到测试中,以设置和验证您的 期望,如下例所示:spring-doc.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()
	}

	// ...

}

另一方面,的 更接近于单元测试。它测试一个 controller 的 Controller。你可以手动注入控制器的 mock 依赖项,并且 它不涉及加载 Spring 配置。此类测试更侧重于风格 并更容易查看正在测试的控制器,是否有任何特定的 Spring 需要 MVC 配置才能工作,依此类推。这也是一个非常 编写临时测试以验证特定行为或调试问题的便捷方法。standaloneSetupstandaloneSetupspring-doc.cn

与大多数“集成与单元测试”的争论一样,没有对错之分 答。但是,使用 the 确实意味着需要额外的测试来验证您的 Spring MVC 配置。 或者,您可以使用 编写所有测试,以便始终 针对你的实际 Spring MVC 配置进行测试。standaloneSetupwebAppContextSetupwebAppContextSetupspring-doc.cn