MockMvc。如何在junit测试中涉及自定义对象

时间:2016-02-19 21:54:02

标签: java spring spring-mvc mocking spring-test

我需要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 formModel model。我不知道如何在junit测试中将这两个参数都用作Mock-Objects。

我非常感谢您的帮助,并希望了解一些资源(书籍)来研究这个问题的主题。

2 个答案:

答案 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;
	}