unitarias tutorial pruebas java unit-testing junit spring-boot spring-test-mvc

java - pruebas - mockmvc tutorial



Cómo escribir una prueba unitaria para un punto final de Spring Boot Controller (4)

Tengo una muestra de la aplicación Spring Boot con lo siguiente

Arrancar clase principal

@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }

Controlador

@RestController @EnableAutoConfiguration public class HelloWorld { @RequestMapping("/") String gethelloWorld() { return "Hello World!"; } }

¿Cuál es la forma más fácil de escribir una prueba unitaria para el controlador? Intenté lo siguiente, pero se queja de no poder conectar automáticamente WebApplicationContext

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = DemoApplication.class) public class DemoApplicationTests { final String BASE_URL = "http://localhost:8080/"; @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Before public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } @Test public void testSayHelloWorld() throws Exception{ this.mockMvc.perform(get("/") .accept(MediaType.parseMediaType("application/json;charset=UTF-8"))) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")); } @Test public void contextLoads() { } }


Agregar @WebAppConfiguration ( org.springframework.test.context.web.WebAppConfiguration ) a su clase DemoApplicationTests funcionará.


Aquí hay otra respuesta usando la configuración independiente de Spring MVC. De esta manera, puede conectar automáticamente la clase de controlador o simularla.

import static org.mockito.Mockito.mock; import static org.springframework.test.web.server.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.server.result.MockMvcResultMatchers.content; import static org.springframework.test.web.server.result.MockMvcResultMatchers.status; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.server.MockMvc; import org.springframework.test.web.server.setup.MockMvcBuilders; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class DemoApplicationTests { final String BASE_URL = "http://localhost:8080/"; @Autowired private HelloWorld controllerToTest; private MockMvc mockMvc; @Before public void setup() { this.mockMvc = MockMvcBuilders.standaloneSetup(controllerToTest).build(); } @Test public void testSayHelloWorld() throws Exception{ //Mocking Controller controllerToTest = mock(HelloWorld.class); this.mockMvc.perform(get("/") .accept(MediaType.parseMediaType("application/json;charset=UTF-8"))) .andExpect(status().isOk()) .andExpect(content().mimeType(MediaType.APPLICATION_JSON)); } @Test public void contextLoads() { } }


Las nuevas mejoras de prueba que se presentaron en Spring Boot 1.4.M2 pueden ayudar a reducir la cantidad de código que necesita para escribir situaciones como estas.

La prueba se vería así:

import static org.springframework.test.web.servlet.request.MockMvcRequestB‌​uilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMat‌​chers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMat‌​chers.status; @RunWith(SpringRunner.class) @WebMvcTest(HelloWorld.class) public class UserVehicleControllerTests { @Autowired private MockMvc mockMvc; @Test public void testSayHelloWorld() throws Exception { this.mockMvc.perform(get("/").accept(MediaType.parseMediaType("application/json;charset=UTF-8"))) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")); } }

Consulte this publicación de blog para obtener más detalles, así como la documentation


Spring MVC ofrece una standaloneSetup que admite la prueba de controladores relativamente simples, sin necesidad de contexto.

Cree un MockMvc registrando una o más instancias de @ Controller y configurando la infraestructura Spring MVC mediante programación. Esto permite un control total sobre la creación de instancias e inicialización de los controladores, y sus dependencias, de forma similar a las pruebas de unidades simples, al tiempo que permite probar un controlador a la vez.

Un ejemplo de prueba para su controlador puede ser algo tan simple como

public class DemoApplicationTests { private MockMvc mockMvc; @Before public void setup() { this.mockMvc = standaloneSetup(new HelloWorld()).build(); } @Test public void testSayHelloWorld() throws Exception { this.mockMvc.perform(get("/") .accept(MediaType.parseMediaType("application/json;charset=UTF-8"))) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")); } }