2012-05-17 23 views
7

Ho aggiornato la mia dipendenza Spring a Spring 3.1.1.RELEASE e sto provando a usare spring-test-mvc per testare un semplice controller. Ho seguito la tecnica utilizzata in Spring REST Controller Test with spring-test-mvc framework, poiché sembra aver funzionato per quella persona, ma finora non ho avuto successo. Penso che ci sia qualche configurazione chiave che mi manca nel mio file di contesto di testUnit test REST Controller con spring-test-mvc

Non ottengo errori Il motivo per cui so che non funziona è perché Hello World non viene mai stampato (vedi Controller) Cosa mi manca qui?

controller:

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

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

Classe di prova:

@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 è davvero promettente, ma manca di documentazione. Sei a conoscenza di qualcosa tranne il README a questo punto? –

+0

@MikePartridge Tutte le informazioni che ho trovato su di esso provengono dal loro sito Github. –

risposta

14

Risulta un'eccezione HttpMessageNotReadable stava accadendo e io non poteva vederlo perché non ero la registrazione o la stampa ovunque. L'ho trovato con la costruzione della richiesta HTTP nella mia classe di test utilizzando la classe DefaultRequestBuilder e l'aggiunta di 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()); 

Così, dopo che, utilizzando l'uscita di andDo(print()), ho potuto vedere che l'eccezione HttpMessageNotReadable veniva gettato, ma non conoscevo i dettagli dell'eccezione o cosa lo stava causando. Per visualizzare i dettagli, ho dovuto aggiungere questo alla classe controller per scrivere i dettagli eccezione al corpo della risposta:

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

Questo ha rivelato la seguente eccezione:

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

che ho fissato con l'aggiunta del @JsonProperty annotazioni ai setter nella mia classe del modello:

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

Cos'è questo metodo "print()" che hai citato? Non riesci a trovarlo nella classe di test e dal momento che la tua classe di test non si estende da nessuna parte, puoi indicare da dove proviene o cosa fa. Grazie. –

+2

@MathiasLin Uso il metodo print() importandolo staticamente, in questo modo: 'import static org.springframework.test.web.server.result.MockMvcResultHandlers.print;' Questo metodo stampa i dettagli sulla richiesta inviata. È MOLTO utile nel debugging. –

+3

dovrebbe indicare che l'istruzione di importazione effettiva è la seguente: 'import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print' – leojh

0

Un good presentation di artefatto primavera-test-MVC è alla fine di questa presentazione, i t inizia intorno alla pagina 116 del doc.