2012-12-08 22 views
6

से मुझे लगता है कि इस तरह दिखता है स्प्रिंग 3.1 का उपयोग कर एक रेस्ट नियंत्रक विधि है:वसंत MVC 3 सामग्री प्रकार "application/json" ग्राहक से काम करता है लेकिन नहीं इकाई परीक्षण

@RequestMapping(value="/user", method=RequestMethod.POST, consumes={MediaType.APPLICATION_JSON_VALUE}) 
public ResponseEntity<String> addUser(@RequestBody @Valid User user){ 
    System.out.println("called/user method"); 
     try{ 
     user = userService.addUser(user); 
     return responseBuilder.addApiResourceSucceeded(user,null); 
     }catch(Exception e){ 
     return responseBuilder.apiActionFailed("user already exists", HttpStatus.CONFLICT); 
     } 
} 

मैं परीक्षण है जो इस तरह दिखता है :

@Before 
public void setUp() { 
    adapter = new AnnotationMethodHandlerAdapter(); 
    request = new MockHttpServletRequest(); 
    response = new MockHttpServletResponse(); 
    mapper = new ObjectMapper(); 
} 
@Test 
public void testAddUser() throws Exception { 
    request.setMethod("POST"); 
    request.setContentType(MediaType.APPLICATION_JSON_VALUE); 
    request.setRequestURI("/user"); 

    ObjectNode userJson = mapper.createObjectNode(); 
    userJson.put("userId", "jonnybz"); 
    userJson.put("email", "[email protected]"); 
    userJson.put("password", "password"); 
    userJson.put("longitude",-10.127205999); 
    userJson.put("latitude", 57.252269); 
    ArrayNode arrNode = mapper.createArrayNode(); 
    arrNode.add(-10.1272059999); 
    arrNode.add(57.2522); 
    userJson.put("lonLat",arrNode); 
    request.setContent(mapper.writeValueAsBytes(userJson)); 
    adapter.handle(request, response, userController); 

    String content = response.getContentAsString(); 
    assertEquals(200, response.getStatus()); 
    User user = dao.listAll().get(0); 
    objectId = user.getId(); 
    assertNotNull(objectId); 
} 

जब मैं अपने ग्राहक ऐप्लिकेशन से इस endpoint के खिलाफ एक फोन पर अमल (कोणीय के साथ विकसित किया) यह बहुत अच्छा काम करता है, लेकिन जब मैं अपने परीक्षण चलाने मैं एक "सामग्री प्रकार 'आवेदन/json' जो से आ रहा है मिल एक HttpMediaTypeNotSupportedException "त्रुटि है कि मैं ट्रैक नहीं कर सकता। अनुरोध मेरी विधि को कभी नहीं मारा प्रतीत होता है। क्या मैं यहाँ कुछ आसान याद कर रहा हूँ?

spring-mvc-test ढांचे का उपयोग करने जा और इस तरह अपने परीक्षण का निर्माण करके इस समस्या को हल:

@Test 
public void testAddUser() throws Exception { 

    ObjectNode userJson = mapper.createObjectNode(); 
    userJson.put("userId", "jonnbz"); 
    userJson.put("email", "[email protected]"); 
    userJson.put("password", "password"); 
    userJson.put("longitude",-10.667205999); 
    userJson.put("latitude", 74.252269); 
    ArrayNode arrNode = mapper.createArrayNode(); 
    arrNode.add(-10.667205999); 
    arrNode.add(74.252269); 
    userJson.put("lonLat",arrNode); 
    MvcResult res = MockMvcBuilders.xmlConfigSetup("classpath:test-context.xml").build() 
      .perform(MockMvcRequestBuilders.post("/user") 
      .accept(MediaType.APPLICATION_JSON) 
      .contentType(MediaType.APPLICATION_JSON) 
      .body(mapper.writeValueAsBytes(userJson))) 
      .andExpect(status().isOk()) 
      .andExpect(content().type(MediaType.APPLICATION_JSON)) 
      .andReturn(); 
      System.out.println(res.getResponse().getContentAsString()); 

} 
+2

आपको उत्तर इनलाइन के साथ प्रश्न को अपडेट करने के बजाय अपने स्वयं के प्रश्न का उत्तर देना चाहिए। – ddewaele

उत्तर

0

तुम भी जब से तुम को शामिल किया है, "application/json" अपने परीक्षण में की Accept हेडर होना चाहिए एक consumes="application/json", स्प्रिंग एमवीसी एसेप्ट हेडर वैल्यू को उपभोग मूल्य से मेल करेगा और केवल मैप किए गए विधि को कॉल करेगा।

+0

परीक्षण सेटहेडर ("स्वीकार करें", MediaType.APPLICATION_JSON_VALUE) में दोनों अनुरोध और प्रतिक्रिया दोनों के लिए स्वीकृति शीर्षलेख जोड़ा गया लेकिन इसका कोई फायदा नहीं हुआ – Maleck13

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^