Mam niewiele działającego kodu, aby skonfigurować MockMVc
na różne sposoby dzięki nowemu rozruchowi wiosennemu 1.4 @WebMvcTest
. Rozumiem podejście oparte na standaloneSetup. To, co chcę wiedzieć, to różnica między konfiguracją MockMvc
do WebApplicationContext
i autowiring MockMvc
.Konfigurowanie MockMvc przy pomocy @WebMvcTest w Spring Boot 1.4 Testowanie MVC
Code Snippet 1: MockMvc przez WebApplicationContext Konfiguracja
@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();
}
}
Zgodnie WebMvcTest
dokumentacji API, Domyślnie, testy opatrzone @WebMvcTest będzie również automatycznie skonfigurować Wiosna Security and MockMvc. Tak więc oczekiwałem tutaj 401 nieautoryzowanego kodu statusu, ale test przechodzi z kodem statusu 200.
Następnie próbowałem auto okablowanie MockMvc
, ale test nie powiedzie się z 401 nieautoryzowanego kodu statusu, chyba że dodam @AutoConfigureMockMvc(secure=false)
lub zaktualizować @WebMvcTest
adnotacji, aby wyłączyć zabezpieczenie:
@WebMvcTest(controllers = IndexController.class, secure = false)
Poniżej znajduje się kod, który przechodzi TYLKO PO BEZPIECZNYM wyłączeniu bezpieczeństwa.
Code Snippet 2: MockMvc przez 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();
}
}
Więc moje pytania to:
Dlaczego nie Fragment kodu 1 raportu aa 401 kod błędu podczas auto stan Nieautoryzowany okablowanie
MockMvc
zrobił . Powtarzam też, co mówi oficjalny dokument: Domyślnie testy opatrzone adnotacją @WebMvcTest również automatycznie konfigurują Spring Security i MockMvc. Jednak w tym przypadku wygląda na to, że@WebMvcTest
nie ma nic wspólnego z automatyczną konfiguracją Spring Security (ponieważ fragment kodu 1 przechodzi bez żadnego błędu 401). W końcu sprowadza się to do ustawieniaMockMvc
. Czy mam tu rację?Jakie są różnice/cele pomiędzy/obu podejść?
W jaki sposób wyłączenie zabezpieczeń za pomocą
@AutoConfigureMockMvc(secure=false)
różni się od wykonania przez@WebMvcTest(controllers = IndexController.class, secure = false)
. Który z nich jest preferowany lub kiedy (lub gdzie) go używać?