【发布时间】:2016-11-05 05:00:39
【问题描述】:
我几乎没有工作代码可以使用新的 Spring Boot 1.4 @WebMvcTest 以不同的方式设置 MockMVc。我了解standaloneSetup 方法。我想知道的是设置MockMvc 到WebApplicationContext 和自动装配MockMvc 之间的区别。
代码片段 1:通过 WebApplicationContext 设置的 MockMvc
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = ProductController.class)
public class ProductControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@MockBean
private ProductService productServiceMock;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void testShowProduct() throws Exception {
Product product1 = new Product();
/*Code to initialize product1*/
when(productServiceMock.getProductById(1)).thenReturn(product1);
MvcResult result = mockMvc.perform(get("/product/{id}/", 1))
.andExpect(status().isOk())
/*Other expectations*/
.andReturn();
}
}
根据WebMvcTest API 文档,默认情况下,使用 @WebMvcTest 注释的测试也会自动配置 Spring Security 和 MockMvc。所以,我预计这里会出现 401 Unauthorized 状态码,但测试通过并显示 200 状态码。
接下来,我尝试自动连接MockMvc,但测试失败并显示 401 Unauthorized 状态码,除非我添加 @AutoConfigureMockMvc(secure=false) 或更新 @WebMvcTest 注释以禁用安全性:
@WebMvcTest(controllers = IndexController.class, secure = false)
以下是仅在明确禁用安全性后通过的代码。
代码片段 2:通过自动装配的 MockMvc
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = ProductController.class)
@AutoConfigureMockMvc(secure=false)
public class ProductControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@MockBean
private ProductService productServiceMock;
@Test
public void testShowProduct() throws Exception {
Product product1 = new Product();
/*Code to initialize product1*/
when(productServiceMock.getProductById(1)).thenReturn(product1);
MvcResult result = mockMvc.perform(get("/product/{id}/", 1))
.andExpect(status().isOk())
/*Other expectations*/
.andReturn();
}
}
所以我的问题是:
为什么 Code sn-p 1 没有报告 401 Unauthorized 状态代码错误,而自动接线
MockMvc报告了。还要重申官方文档所说的 默认情况下,使用 @WebMvcTest 注释的测试也将自动配置 Spring Security 和 MockMvc。 但是,在这种情况下,@WebMvcTest似乎与自动配置无关Spring Security(因为代码片段 1 通过没有任何 401 错误)。最后归结为我如何设置MockMvc。我说的对吗?这两种方法的区别/目标是什么?
通过
@AutoConfigureMockMvc(secure=false)禁用安全性与通过@WebMvcTest(controllers = IndexController.class, secure = false)禁用安全性有何不同。哪个是首选方法或何时(或在何处)使用它们?
【问题讨论】:
标签: spring-mvc spring-boot spring-mvc-test