对于最新稳定版本,请使用Spring Framework 7.0.1spring-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

webAppContext设置加载你的实际 Spring MVC 配置,从而实现更完整的集成测试。由于 TestContext 框架缓存已加载的 Spring配置,它有助于保持测试快速运行,即使你在测试套件中引入了更多测试。此外,你可以通过 Spring 向控制器注入模拟服务配置,以保持专注于测试网页层。以下示例声明一个带有 Mockito 的模拟服务:spring-doc.cadn.net.cn

<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>

然后你可以将模拟服务注入测试中,以设置并验证你的期望,如下示例所示: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()
	}

	// ...

}

独立设置而,则更接近单元测试。它一次测试一个控制器。你可以手动注入带有模拟依赖关系的控制器,这不涉及加载 Spring 配置。这类测试更侧重于样式并使得更容易判断正在测试的是哪个控制器,是否需要特定的MVC 配置才能正常工作,等等。 这独立设置也是一种非常方便编写临时测试以验证特定行为或调试问题的方法。spring-doc.cadn.net.cn

和大多数“集成与单元测试”的争论一样,没有对错之分 答。 然而,使用独立设置确实意味着需要额外的webAppContext设置测试以验证你的 Spring MVC 配置。或者,你可以写所有测试webAppContext设置, 以始终测试你实际的Spring MVC配置。spring-doc.cadn.net.cn