2012-05-17 14 views
7

Podniosłem moją zależność Spring do Spring 3.1.1.RELEASE i próbuję użyć spring-test-mvc, aby przetestować prosty kontroler. Śledziłem technikę zastosowaną w Spring REST Controller Test with spring-test-mvc framework, ponieważ wydaje się, że zadziałało dla tej osoby, ale jak dotąd nie udało mi się. Myślę, że istnieje kluczowa konfiguracja, której nie ma w moim pliku kontekstowym testuJednostka testująca kontroler REST z testem sprężynowym-mvc

Nie otrzymuję żadnych błędów, ponieważ wiem, że to nie działa, ponieważ Hello World nigdy nie zostanie wydrukowane (patrz kontroler). Czego tu mi brakuje?

Kontroler:

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

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

Klasa test:

@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 jest naprawdę obiecujący, ale brakuje w nim dokumentacji. Czy jesteś świadomy czegokolwiek oprócz README w tym momencie? –

+0

@MikePartridge Wszystkie informacje, które znalazłem na ten temat pochodzą ze strony Github. –

Odpowiedz

14

Okazuje się wyjątek HttpMessageNotReadable został występujących i nie mogłem zobaczyć go, bo nie było zalogowaniu lub drukując je w dowolnym miejscu. Znalazłem go poprzez budowanie żądania HTTP w mojej klasie testowej za pomocą klasy DefaultRequestBuilder i dodanie 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()); 

Więc po tym, korzystając z wyjścia andDo(print()), mogłem zobaczyć, że wyjątek HttpMessageNotReadable został wyrzucony, ale nie znał szczegółów wyjątku ani tego, co go powodowało. Aby zobaczyć szczegóły, musiałem dodać do klasy kontrolera napisać szczegóły Wyjątkiem organizmie reakcji:

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

Ujawniło następujący wyjątek:

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

które stały przez dodanie @JsonProperty adnotacji do ustawiaczy w mojej klasie modelu:

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

Co to jest wspomniana metoda "print()"? Nie możesz go znaleźć w klasie testowej, a ponieważ Twoja klasa testowa nie rozszerza się z dowolnego miejsca, możesz wskazać, skąd ją masz i co robi. Dzięki. –

+2

@MathiasLin Używam metody print(), importując ją statycznie, tak jak to: 'import static org.springframework.test.web.server.result.MockMvcResultHandlers.print;' Ta metoda drukuje szczegółowe informacje o wysyłanym żądaniu. Jest BARDZO przydatny w debugowaniu. –

+3

powinien wskazywać, że faktyczna instrukcja importu wygląda następująco: 'import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print' – leojh

0

good presentation z wiosenno-test-mvc artefaktu jest na koniec następnego prezentacji i t zaczyna się wokół strony 116 dokumentu.

Powiązane problemy