Установите @ModelAttribute в MockHttpServletRequest в тесте JUnit - PullRequest
6 голосов
/ 14 июня 2011

Я пытаюсь проверить пружинный контроллер MVC.Один из методов принимает ввод формы как метод POST.Этот метод получает commandObject формы через @ModelAttribute аннотацию.Как настроить этот тестовый пример с помощью теста Springit Junit?

Метод контроллера выглядит следующим образом:

@RequestMapping(method = RequestMethod.POST)
public String formSubmitted(@ModelAttribute("vote") Vote vote, ModelMap model) { ... }

Объект Vote определен в .jsp:

 <form:form method="POST" commandName="vote" name="newvotingform">

Теперь я хочу проверить эту форму POST в тесте, который настроен следующим образом:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/spring/applicationContext.xml"})
@TestExecutionListeners({WebTestExecutionerListener.class, DependencyInjectionTestExecutionListener.class})
public class FlowTest { ... }

Фактический метод, который проверяет форму POST:

@Test
public void testSingleSession() throws Exception {

    req = new MockHttpServletRequest("GET", "/vote");
    res = new MockHttpServletResponse();
    handle = adapter.handle(req, res, vc);
    model = handle.getModelMap();

    assert ((Vote) model.get("vote")).getName() == null;
    assert ((Vote) model.get("vote")).getState() == Vote.STATE.NEW;

    req = new MockHttpServletRequest("POST", "/vote");
    res = new MockHttpServletResponse();

    Vote formInputVote = new Vote();
    formInputVote.setName("Test");
    formInputVote.setDuration(45);

    //        req.setAttribute("vote", formInputVote);
    //        req.setParameter("vote", formInputVote);
    //        req.getSession().setAttribute("vote", formInputVote);

    handle = adapter.handle(req, res, vc) ;
    model = handle.getModelMap();

    assert "Test".equals(((Vote) model.get("vote")).getName());
    assert ((Vote) model.get("vote")).getState() == Vote.STATE.RUNNING;
}

3 строки, которые в настоящее время закомментированы, являются слабыми попытками сделать эту работу - однако она не сработала.Кто-нибудь может дать несколько советов по этому поводу?

Я действительно не хочу вызывать метод контроллеров непосредственно в моем тесте, поскольку я чувствую, что это не будет действительно проверять контроллер в веб-контексте.

Ответы [ 2 ]

7 голосов
/ 12 августа 2013

В Spring MVC 3 вы можете использовать что-то вроде этого:

        mockMvc.perform(post("/secretSauce")
            .param("password", "123")
            .sessionAttr("sessionData", "tomato"))
            .andDo(print())
            .andExpect(status().isOk());
7 голосов
/ 14 июня 2011

Вы должны смоделировать, что будет делать ваша HTML-форма. Он просто передаст параметры запроса строки. Попробуйте:

req.setParameter("name","Test");
req.setParameter("duration","45");
...