Как проверить POST весной MVC

Моя проблема в том, как это назвать. я мог бы сделать

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

но это не то, что я хотел бы сделать. Я хотел бы, чтобы MyObject был в теле сообщения запроса? Как это может быть сделано?

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

Просто чтобы прояснить, я говорю о модульном тестировании.

Редактировать:

@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;
}

Ответы на вопрос(2)

Решение Вопроса

Посмотрите пример кода ниже, который демонстрирует модульное тестирование контроллера с использованием junit и spring-test.

@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) 
            {

            } 
    }
}
 pethel27 сент. 2012 г., 08:39
См редактировать оригинальный пост полного контроллера
 pethel27 сент. 2012 г., 14:21
Спасибо ... request.setAttribute ("MyObject», п); работает
 FFL27 сент. 2012 г., 08:34
Он может быть преобразован в любой тип, который принимает ваш контроллер. Сформируйте данные, получите байты и установите их для запроса.
 pethel27 сент. 2012 г., 14:33
Я могу передать объект, но атрибуты в объекте являются нулевыми, даже если я установил их в методе теста. Есть идеи?
 pethel27 сент. 2012 г., 08:31
Большое спасибо. Должен ли это JSON? Должен ли я использовать requestbody?
 FFL27 сент. 2012 г., 08:58
Если вы пытаетесь принять атрибуты модели, контроллер необходимо изменить, например (@ModelAttribute ("MyObject») MyObject o, значение @PathVariable String), а затем в модульном тесте вы можете установить MyObject в качестве параметра, например request.setAttribute ("MyObject»о).
 FFL27 сент. 2012 г., 08:37
Вам необходимо преобразовать o в один из типов сообщений, которые принимает контроллер. Какой тип сообщения принимает контроллер? Вам нравится JSON / XML?
 pethel27 сент. 2012 г., 08:47
Извините, я не следую
 pethel27 сент. 2012 г., 08:35
Так что я мог сделать request.setContent (o); ?

Вам необходимо использовать RequestBody:

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

общая информация о документации тела запроса:http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html#mvc-ann-requestbody

 insomiac27 сент. 2012 г., 01:48
Вы можете использовать джунит ..
 pethel26 сент. 2012 г., 21:12
Хорошо .. может быть .. но притвориться, что я использую это. Как мне это проверить?

Ваш ответ на вопрос