Tôi có một vài mã hoạt động để thiết lập MockMVc
theo các cách khác nhau với Khởi động mùa xuân mới 1.4 @WebMvcTest
. Tôi hiểu cách tiếp cận standaloneSetup. Điều tôi muốn biết là sự khác biệt giữa việc thiết lập MockMvc
đến WebApplicationContext
và bằng cách tự động điền MockMvc
.Thiết lập MockMvc với @WebMvcTest trong Spring Boot 1.4 Kiểm tra MVC
Code Snippet 1: MockMvc qua WebApplicationContext Cài đặt
@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();
}
}
Theo WebMvcTest
tài liệu API, Theo mặc định, kiểm tra chú thích với @WebMvcTest cũng sẽ tự động cấu hình Xuân An và MockMvc. Vì vậy, tôi đã dự kiến mã trạng thái không được phép 401 ở đây, nhưng thử nghiệm được chuyển với mã trạng thái 200.
Tiếp theo, tôi đã cố gắng tự động dây MockMvc
, nhưng các thử nghiệm không thành công với 401 mã trạng thái trái phép, trừ khi tôi thêm @AutoConfigureMockMvc(secure=false)
hoặc cập nhật @WebMvcTest
chú thích để vô hiệu hóa bảo mật:
@WebMvcTest(controllers = IndexController.class, secure = false)
Tiếp theo là mã mà đi CHỈ SAU vô hiệu hóa bảo mật một cách rõ ràng.
Code Snippet 2: MockMvc qua Autowiring
@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();
}
}
Vì vậy, câu hỏi của tôi là:
Tại sao không Mã đoạn mã 1 báo cáo aa 401 Unauthorized lỗi mã trạng thái trong khi tự động dây
MockMvc
làm . Ngoài ra, nhắc lại những gì tài liệu chính thức nói Theo mặc định, các bài kiểm tra được chú thích bằng @WebMvcTest cũng sẽ tự động định cấu hình Spring Security và MockMvc. Nhưng, trong trường hợp này, nó xuất hiện@WebMvcTest
không liên quan gì đến việc tự động định cấu hình Spring Security (Vì Đoạn mã 1 đi qua mà không có bất kỳ lỗi 401 nào). Cuối cùng nó cũng tóm tắt cách tôi thiết lậpMockMvc
. Tôi có đúng ở đây không?Sự khác biệt/mục tiêu giữa/của cả hai cách tiếp cận là gì?
Cách tắt bảo mật qua
@AutoConfigureMockMvc(secure=false)
khác với việc thực hiện qua@WebMvcTest(controllers = IndexController.class, secure = false)
. Cái nào được ưu tiên tiếp cận hoặc khi nào (hoặc ở đâu) để sử dụng chúng?