我有一些可以用新的Spring Boot 1.4 @WebMvcTest
以不同方式设置MockMVc
的工作代码。我理解standaloneSetup
方法的使用。我想知道的是通过WebApplicationContext
设置MockMvc
和通过自动装配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未经授权的状态代码,但是测试通过了200状态代码。接下来,我尝试自动装配MockMvc,但是除非我添加@AutoConfigureMockMvc(secure = false)或更新@WebMvcTest注释以禁用安全性,否则测试将失败且返回401未授权状态代码。
@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();
}
}
所以我的问题是:
为什么代码段1没有报告401未经授权状态码错误,而自动装配
MockMvc
却报告了。同时重申官方文档中的内容:默认情况下,使用@WebMvcTest注释的测试还将自动配置Spring Security和MockMvc。 但是,在这种情况下,似乎@WebMvcTest
与自动配置Spring Security无关(因为代码段1通过而无任何401错误)。最后,这归结于我如何设置MockMvc
。我这里正确吗?两种方法之间的差异/目标是什么?
如何通过
@AutoConfigureMockMvc(secure=false)
禁用安全性,与通过@WebMvcTest(controllers=IndexController.class, secure=false)
有何区别?哪种方法更可取或何时(或何处)使用它们?