#spring #spring-mvc #junit #annotations
#spring #spring-mvc #junit #примечания
Вопрос:
Я пытаюсь протестировать контроллер spring mvc. Один из методов принимает ввод формы в качестве метода POST. Этот метод получает commandObject формы через @ModelAttribute
аннотацию. Как я могу настроить этот тестовый пример, используя Spring Junit test?
Метод контроллера выглядит следующим образом:
@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 { ... }
Фактический метод, который тестирует сообщение формы:
@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 строки, которые в настоящее время закомментированы, являются слабыми попытками заставить это работать — однако это не сработало.
Кто-нибудь может дать несколько советов по этому поводу?
Я действительно не хочу вызывать метод controllers непосредственно в моем тесте, поскольку я чувствую, что это на самом деле не будет тестировать контроллер в веб-контексте.
Ответ №1:
Вы должны смоделировать, что будет делать ваша HTML-форма. Он просто передаст параметры строкового запроса. Попробуйте:
req.setParameter("name","Test");
req.setParameter("duration","45");
Ответ №2:
С Spring MVC 3 вы можете использовать что-то в этом роде:
mockMvc.perform(post("/secretSauce")
.param("password", "123")
.sessionAttr("sessionData", "tomato"))
.andDo(print())
.andExpect(status().isOk());
Комментарии:
1. Я бы использовал
flashAttr("vote", new Vote())
вместоsessionAttr()