设置选择
MockMvc可以通过两种方式进行设置。一种是直接指向要测试的控制器,并以编程方式配置Spring MVC基础设施。另一种是指向具有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 value="org.example.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
则略微接近单元测试。它一次测试一个控制器。您可以手动将控制器与模拟依赖项注入,并且不涉及加载Spring配置。这些测试更专注于样式,并且更容易看出正在测试哪个控制器,是否需要任何特定的Spring MVC配置才能工作等。 standaloneSetup
也是编写特定行为验证或调试问题的临时测试的非常方便的方式。
与大多数“集成测试与单元测试”辩论一样,没有正确或错误的答案。但是,使用standaloneSetup
意味着需要额外的webAppContextSetup
测试来验证您的Spring MVC配置。或者,您可以使用webAppContextSetup
编写所有测试,以始终针对实际的Spring MVC配置进行测试。