working sirve que qualifier para not java spring unit-testing spring-boot autowired

java - sirve - spring autowired qualifier



Prueba de la unidad Springboot Autowired (2)

Tengo las siguientes clases:

Clase ApplicationAndConfiguration

package mypackage.service; import mypackage.service.util.MyUtility; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @SpringBootApplication public class ApplicationAndConfiguration { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(ApplicationAndConfiguration.class, new String[]{}); } @Bean(initMethod="init") public MyUtility birtUtil() { return new MyUtility(); } }

Clase MyRestController

package mypackage.service.controllers; import mypackage.service.util.MyUtility; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class MyRestController { @Autowired private MyUtility util; @RequestMapping("/getLibraryName") public String getMessageFromRest(@RequestParam String name) { return "name was " + name + "//" + util.getMessage(); } }

Clase MyUtility

package mypackage.service.util; public class MyUtility { private String message; public void init() { setMessage("MyUtility correctly initialized!"); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }

Cuando inicio la aplicación y la ejecuto como un jar independiente, o desde el IDE (Eclipse), no hay ningún problema, todo funciona como se espera.

Sin embargo, quiero escribir una prueba de unidad para probar mi clase MyRestController ... y obtengo un NPE porque el campo Autowired util es nulo (dentro de la clase MyRestController ).

Aquí está mi clase de prueba:

package mypackage.service.controllers; import static org.hamcrest.Matchers.equalTo; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import mypackage.service.ApplicationAndConfiguration; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; @SpringApplicationConfiguration(classes = ApplicationAndConfiguration.class) @WebAppConfiguration @RunWith(SpringJUnit4ClassRunner.class) public class TestController { private MockMvc mvc; @Before public void setup() throws Exception { mvc = MockMvcBuilders.standaloneSetup(new MyRestController()).build(); } @Test public void MyTestController() throws Exception { mvc.perform(MockMvcRequestBuilders.get("/getLibraryName").param("name", "test").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().string(equalTo("name was test//MyUtility correctly initialized!"))); } }

Definitivamente me estoy perdiendo algo para que mi campo Autowired se llene durante las pruebas, y no solo durante la ejecución de la aplicación estándar ...

Cualquier puntero por qué no funciona?


Desde SpringBoot 1.4, todas las clases cambiaron y quedaron obsoletas https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4.0-M2-Release-Notes Reemplace el corredor y la configuración con los siguientes. SpringRunner detectará el marco de prueba por ti.

@RunWith(SpringRunner.class) @SpringBootTest(classes = { FileService.class, AppProperties.class, DownloadConfigEventHandler.class }) @EnableConfigurationProperties public class ConfigMatrixDownloadAndProcessingIntegrationTests extends ConfigMatrixDownloadAbstractTest { // @Service FileService @Autowired private FileService fileService; // @Configuration AppProperties @Autowired private AppProperties properties; // @Compoenet DownloadConfigEventHandler @Autowired private DownloadConfigEventHandler downloadConfigEventHandler; .. .. }

¡Todas estas instancias serán autorizadas como se espera! Incluso Spring Events with the Publisher está funcionando como se espera en https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2 .


La configuración independiente de MockMvc es para pruebas unitarias. Estás haciendo pruebas de integración cuando estás creando un contexto Spring en prueba. No mezcle estos dos tipos de pruebas.

Así que solo cambialo de esta manera:

@SpringApplicationConfiguration(classes = ApplicationAndConfiguration.class) @WebAppConfiguration @RunWith(SpringJUnit4ClassRunner.class) public class TestController { private MockMvc mvc; @Autowired private WebApplicationContext webApplicationContext; @Before public void setup() throws Exception { mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); }