2012-05-17 33 views
7

He actualizado mi dependencia Spring a Spring 3.1.1.RELEASE y estoy tratando de usar spring-test-mvc para probar la unidad de un controlador simple. He estado siguiendo la técnica utilizada en Spring REST Controller Test with spring-test-mvc framework, ya que parece haber funcionado para esa persona, pero hasta ahora no he tenido éxito. Creo que hay alguna configuración de clave que me falta en el archivo de contexto de pruebaPruebas unitarias REST Controller con spring-test-mvc

La razón por la que sé que no funciona es porque Hello World nunca se imprime (ver Controlador). ¿Qué me falta aquí?

controlador:

@Controller 
@RequestMapping("/debug") 
public class DebugOutputController { 

    @RequestMapping(method = RequestMethod.POST) 
    public void saveDebugOutput(@RequestBody DebugOutput debugOutput, HttpServletResponse response) { 
     System.out.println("Hello World"); 
    } 
} 

clase de prueba:

@RunWith(SpringJUnit4ClassRunner.class) //this lets tests access Spring beans defined in the context config file 
@ContextConfiguration(locations={"file:src/test/resources/itest/restAPITestContext.xml"}) //tells the test where to get configuration and beans to be used by the test. 
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class}) //overrides the default stack of listeners 
public class ITRestAPI{ 

@Autowired 
private DebugOutputController debugOutputController; 

private MockMvc mockMvc; 

@Before 
public void setUp() throws Exception { 
    mockMvc = MockMvcBuilders.standaloneSetup(debugOutputController).build(); 
} 

@After 
public void tearDown() throws Exception { 
} 

@Test 
public void shouldPerformPost() throws Exception { 
    this.mockMvc.perform(post("/debug")); 
} 
} 

restAPITestContext.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <mvc:annotation-driven /> 
    <mvc:default-servlet-handler /> 
    <context:component-scan resource-pattern="*DebugOutputController*" base-package="com.company.project.servlet" />  

</beans> 
+0

spring-test-mvc es realmente prometedor, pero carece de documentación. ¿Conoces algo más que el LÉEME en este punto? –

+0

@MikePartridge Toda la información que he encontrado al respecto proviene de su sitio Github. –

Respuesta

14

Resulta una excepción HttpMessageNotReadable estaba ocurriendo y yo no podía verlo porque no estaba tala o imprimir en cualquier lugar. Lo encontré por la construcción de la petición HTTP en mi clase de prueba utilizando la clase DefaultRequestBuilder y añadiendo un andDo(print()):

DefaultRequestBuilder requestBuilder = MockMvcRequestBuilders.post("/debug").contentType(MediaType.APPLICATION_JSON).body(new String("{\"T1\":109.1, \"T2\":99.3}").getBytes()); 
this.mockMvc.perform(requestBuilder).andDo(print()); 

Así que después de eso, utilizando la salida de andDo(print()), pude ver que la excepción HttpMessageNotReadable estaba siendo lanzada, pero no sabía los detalles de la excepción o lo que estaba causando. Para ver los detalles, he tenido que añadir esto a la clase controlador para escribir los detalles de la excepción al cuerpo de la respuesta:

@ExceptionHandler(HttpMessageNotReadableException.class) 
@ResponseBody 
public String handleException1(HttpMessageNotReadableException ex) 
{ 
    return ex.getMessage(); 
} 

Esto reveló la siguiente excepción:

Could not read JSON: Unrecognized field "T1" (Class com.company.project.model.device.DebugOutput), not marked as ignorable 

la que me fijo mediante la adición de la @JsonProperty anotación a los setters en mi clase del modelo:

@JsonProperty("T1") 
public void setT1(Float t1) { 
    T1 = t1; 
} 
+0

¿Qué es este método de "impresión()" que mencionaste? No puede encontrarlo en la clase de prueba y dado que su clase de prueba no se extiende desde ningún lugar, puede señalar de dónde lo sacó o qué hace. Gracias. –

+2

@MathiasLin Utilizo el método print() importándolo estáticamente, de la siguiente manera: 'import static org.springframework.test.web.server.result.MockMvcResultHandlers.print;' Este método imprime detalles sobre la solicitud que se envía. Es MUY útil en la depuración. –

+3

debe señalar que la declaración de importación real es la siguiente: 'import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print' – leojh

0

Un artefacto good presentation de primavera-test-mvc se encuentra al final de la siguiente presentación, i t comienza alrededor de la página 116 del documento.