2012-09-26 3 views
3

Mon problème est de savoir comment appeler cela. Je pourrais faireComment tester POST spring mvc

MyObject o = new MyObject(); 
myController.save(o, "value"); 

mais ce n'est pas ce que je voudrais faire. Je voudrais que le MyObject soit dans le corps du message de la demande? Comment cela peut-il être fait?

@Requestmapping(value="/save/{value}", method=RequestMethod.POST) 
public void post(@Valid MyObject o, @PathVariable String value{ 
    objectService.save(o); 
} 

Pour être clair, je parle de tests unitaires.

Edit:

@RequestMapping(value = "/", method = RequestMethod.POST) 
public View postUser(ModelMap data, @Valid Profile profile, BindingResult bindingResult) { 

    if (bindingResult.hasErrors()) { 

     return dummyDataView; 
    } 


    data.put(DummyDataView.DATA_TO_SEND, "users/user-1.json"); 
    profileService.save(profile); 
    return dummyDataView; 
} 

Répondre

2

Voir exemple de code ci-dessous qui montre l'unité à tester un contrôleur JUnit et test de printemps.

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({ 
     DependencyInjectionTestExecutionListener.class, 
     DirtiesContextTestExecutionListener.class, 
     TransactionalTestExecutionListener.class }) 
@Transactional 
@ContextConfiguration(locations = { 
    "classpath:rest.xml" 
    }) 
public class ControllerTest{ 
    private MockHttpServletRequest request; 
    private MockHttpServletResponse response; 



    @Autowired 
    private RequestMappingHandlerAdapter handlerAdapter; 

    @Autowired 
    private RequestMappingHandlerMapping handlerMapping; 

    @Before 
    public void setUp() throws Exception 
    { 
     this.request = new MockHttpServletRequest(); 
     request.setContentType("application/json"); 
     this.response = new MockHttpServletResponse(); 
    } 

    @Test 
    public void testPost(){ 
     request.setMethod("POST"); 
     request.setRequestURI("/save/test"); //replace test with any value 

     final ModelAndView mav; 
     Object handler; 

     try{ 
       MyObject o = new MyObject(); 
       //set values 
       //Assuming the controller consumes json 
       ObjectMapper mapper = new ObjectMapper(); 
       //set o converted as JSON to the request body 
       //request.setContent(mapper.writeValueAsString(o).getBytes()); 
       request.setAttribute("attribute_name", o); //in case you are trying to set a model attribute. 
       handler = handlerMapping.getHandler(request).getHandler(); 
       mav = handlerAdapter.handle(request, response, handler); 
       Assert.assertEquals(200, response.getStatus()); 
       //Assert other conditions. 
      } 
     catch (Exception e) 
      { 

      } 
    } 
} 
+0

Merci beaucoup. Faut-il json? Dois-je utiliser le requestbody? – pethel

+0

Il peut être converti en n'importe quel type que votre contrôleur accepte. Former les données, obtenir les octets et le définir à la demande. – FFL

+0

Donc, je pourrais faire request.setContent (o); ? – pethel

0

Vous devez utiliser RequestBody:

@Requestmapping(value="/save/{value}", method=RequestMethod.POST) 
public void post(@RequestBody MyObject o, @PathVariable String value{ 
    objectService.save(o); 
} 

informations générales sur la documentation du corps de la requête: http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html#mvc-ann-requestbody

+0

Ok .. peut-être ... mais prétendre que je l'utilise. Comment puis-je tester cette unité? – pethel

+0

vous pouvez utiliser junit .. – insomiac

Questions connexes