Ho pochi codici funzionanti per impostare MockMVc
in diversi modi con il nuovo Spring Boot 1.4 @WebMvcTest
. Comprendo l'approccio standaloneSetup. Quello che voglio sapere è la differenza tra la configurazione di MockMvc
tramite WebApplicationContext
e l'autowiring MockMvc
.Configurazione di MockMvc con @WebMvcTest in Spring Boot 1.4 Test MVC
Snippet di codice 1: MockMvc attraverso WebApplicationContext Setup
@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();
}
}
Come da WebMvcTest
documentazione delle API, Per impostazione predefinita, le prove annotate con @WebMvcTest anche auto-configurare Primavera di sicurezza e MockMvc. Quindi, mi aspettavo un codice di stato 401 non autorizzato qui, ma il test passa con un codice di stato 200.
Successivamente, ho cercato di cablaggio auto MockMvc
, ma il test non riesce con 401 codice di stato non autorizzato, a meno che non aggiungo @AutoConfigureMockMvc(secure=false)
o aggiornare il @WebMvcTest
annotazioni per disattivare la protezione:
@WebMvcTest(controllers = IndexController.class, secure = false)
seguito è riportato il codice che passa SOLO DOPO disattivare esplicitamente la sicurezza.
Snippet di codice 2: MockMvc attraverso 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();
}
}
Quindi le mie domande sono:
Perché non Codice snippet 1 rapporto aa 401 errore di codice di stato non autorizzato durante il cablaggio auto
MockMvc
fatto . Ripetendo anche ciò che dice il documento ufficiale Per impostazione predefinita, i test annotati con @WebMvcTest configurano automaticamente anche Spring Security e MockMvc. Ma, in questo caso, appare@WebMvcTest
non ha nulla a che fare con la configurazione automatica di Spring Security (perché il frammento di codice 1 passa senza errori 401). Finalmente si riduce a come ho impostato ilMockMvc
. Sono corretto qui?Quali sono le differenze/obiettivi tra/di entrambi gli approcci?
In che modo la disattivazione della sicurezza tramite
@AutoConfigureMockMvc(secure=false)
differisce dal modo di eseguire fino a@WebMvcTest(controllers = IndexController.class, secure = false)
. Quale è l'approccio preferito o quando (o dove) usarli?