2012-05-17 22 views
7

Ich habe meine Spring-Abhängigkeit Spring 3.1.1.RELEASE aktualisiert und ich versuche spring-test-mvc Unit-Test einen einfachen Controller zu verwenden. Ich habe die in Spring REST Controller Test with spring-test-mvc framework verwendete Technik verfolgt, da es für diese Person funktioniert zu haben scheint, aber bisher war ich nicht erfolgreich. Ich denke, es gibt einige Schlüsselkonfiguration I "in der Datei mein Test-Kontext fehlt m. ​​Komponententest REST-Controller mit Feder-Test-mvc

ich keine Fehler auftreten. Der Grund, warum ich weiß, dass es nicht funktioniert, weil Hello World nie (siehe Controller) gedruckt wird. Was soll ich hier fehlt?

Controller:

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

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

Testklasse:

@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 ist wirklich vielversprechend, aber es fehlt Dokumentation. Ist Ihnen zu diesem Zeitpunkt irgendetwas anderes als die README bekannt? –

+0

@MikePartridge Alle Informationen, die ich darüber gefunden habe, stammen von der Github-Website. –

Antwort

14

Schaltet eine HttpMessageNotReadable Ausnahme aus auftritt, und ich kann es nur nicht sehen, weil ich nicht anmelden oder es überall zu drucken. Ich fand es durch die HTTP-Anforderung in meiner Testklasse des Aufbau mit der DefaultRequestBuilder Klasse und das Hinzufügen von einem 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()); 

So nach, dass die Ausgabe von andDo(print()) mit, konnte ich sehen, dass die HttpMessageNotReadable Ausnahme ausgelöst wurde, aber kannte die Details der Ausnahme nicht oder was sie verursachte. Um die Details zu sehen, hatte ich dies auf die Controller-Klasse hinzufügen, um die Ausnahme Details zu dem Antworttext zu schreiben:

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

Diese die folgenden Ausnahme ergaben:

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

, die ich durch die Zugabe der festen @JsonProperty Anmerkung zu den Setter in meiner Modellklasse:

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

Was ist diese "print()" Methode, die Sie erwähnt haben? Kann es nicht in der Testklasse finden und da sich Ihre Testklasse nicht von irgendwo erstreckt, können Sie darauf hinweisen, woher Sie es haben oder was es tut. Vielen Dank. –

+2

@MathiasLin Ich benutze die Methode print(), indem ich sie statisch importiere: 'import static org.springframework.test.web.server.result.MockMvcResultHandlers.print;' Diese Methode gibt Details über die gesendete Anfrage aus. Es ist sehr nützlich beim Debuggen. –

+3

sollte darauf hinweisen, dass die eigentliche Importanweisung wie folgt lautet: 'import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print' – leojh

0

A good presentation feder Test-mvc Artefakt ist am Ende der folgenden Darstellung, i t beginnt um die Seite 116 des Dokuments.