我需要JUnit测试来检查控制器。通过提交表单来调用控制器的方法。此方法接收填充的对象EmailDispatchForm form
。
以下是来自控制器的片段:
@RequestMapping(value={"/sendEmail"}, method=POST)
public String sendEmail(EmailDispatchForm form,Model model ){
String status = "OK";
try {
workFlows.sendEmailAndRecordHistory(form);
} catch (Exception e) {
status = "ERROR";
model.addAttribute("errDescription", e.getCause().getMessage());
logger.error(e, e);
} finally {
model.addAttribute("sentEmailStatus", status);
}
return CommonConstants.VIEW_EMAIL_SENT;
}
这是我的junit测试:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {WebConfig.class})
public class HomeControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void testShowEmailForm() throws Exception{
mockMvc.perform(get("/emailForm")).andExpect(view().name(CommonConstants.VIEW_EMAIL));
}
}
如何在控制器中看到方法sendEmail()
,它有两个参数:EmailDispatchForm form
,Model model
。我不知道如何在junit测试中将这两个参数都用作Mock-Objects。
我非常感谢您的帮助,并希望了解一些资源(书籍)来研究这个问题的主题。
答案 0 :(得分:0)
第一个问题是您正在尝试使用GET并访问POST URL。 您的测试方法应如下所示:
@Test
public void testShowEmailForm() throws Exception{
mockMvc.perform(post("/sendEmail")).andExpect(view().name(CommonConstants.VIEW_EMAIL));
}
还在控制器方法中添加@RequestBody
public String sendEmail(@RequestBody EmailDispatchForm form,Model model )
要添加表单,只需添加到测试方法:
.contentType(MediaType.APPLICATION_JSON)
.content(json)
其中JSON是`EmailDispatchForm表单`对象的JSON形式。
希望这有帮助。
答案 1 :(得分:0)
所以,我找到了另一个解决方案。它看起来像这样:
@Test
public void loginUser() throws Exception {
LoginForm loginForm = new LoginForm();
loginForm.setPassword("admin");
loginForm.setUserId("admin");
RequestBuilder request = post("/authentication")
.flashAttr("loginForm", loginForm);
mockMvc
.perform(request)
.andDo(MockMvcResultHandlers.print())
.andExpect(redirectedUrl("emailForm"));
}
@RequestMapping(value={"/authentication"}, method=POST)
public String toAuthentication(@ModelAttribute("loginForm")LoginForm loginForm, Model model){
String view ="redirect:emailForm";
// some activity here to take the loginForm and process it
return view;
}