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 进行测试时,也可以使用此设置 如上所示。
您应该使用哪个设置选项?
加载实际的 Spring MVC 配置,从而产生更多
完成集成测试。由于 TestContext 框架缓存加载的 Spring
配置,它有助于保持测试快速运行,即使您在
测试套件。此外,您可以通过 Spring 将模拟服务注入控制器
配置以保持专注于测试 Web 层。以下示例声明
使用 Mockito 的模拟服务:webAppContextSetup
<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()
}
// ...
}
另一方面,它更接近于单元测试。它测试一个
一次控制器。您可以手动注入控制器的模拟依赖项,以及
它不涉及加载 Spring 配置。这样的测试更侧重于风格
并更容易查看正在测试的控制器,是否有任何特定的 Spring
需要 MVC 配置才能工作,依此类推。这也是一个非常
编写临时测试以验证特定行为或调试问题的便捷方法。standaloneSetup
standaloneSetup
与大多数“集成与单元测试”的争论一样,没有对错之分
答。但是,使用 确实意味着需要进行其他测试以验证您的 Spring MVC 配置。
或者,您可以使用 编写所有测试,以便始终
针对实际的 Spring MVC 配置进行测试。standaloneSetup
webAppContextSetup
webAppContextSetup