Spring MVC:如何从返回String的控制器方法unit testingModel的属性?

例如,

package com.spring.app; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * Handles requests for the application home page. */ @Controller public class HomeController { @RequestMapping(value = "/", method = RequestMethod.GET) public String home(final Model model) { model.addAttribute("msg", "SUCCESS"); return "hello"; } } 

我想使用JUnit从home()测试model的属性及其值。 我可以将返回类型更改为ModelAndView以使其成为可能,但我想使用String因为它更简单。 但这不是必须的。

无论如何检查model而不改变home()的返回类型? 或者它无法帮助?

你可以使用Spring MVC Test :

 mockMvc.perform(get("/")) .andExpect(status().isOk()) .andExpect(model().attribute("msg", equalTo("SUCCESS"))) //or your condition 

这里有充分说明的例子

你可以使用Mockito。

例:

 @RunWith(MockitoJUnitRunner.class) public HomeControllerTest { private HomeController homeController; @Mock private Model model; @Before public void before(){ homeController = new HomeController(); } public void testSomething(){ String returnValue = homeController.home(model); verify(model, times(1)).addAttribute("msg", "SUCCESS"); assertEquals("hello", returnValue); } } 

我尝试使用副作用来回答这个问题。

 @Test public void testHome() throws Exception { final Model model = new ExtendedModelMap(); assertThat(controller.home(model), is("hello")); assertThat((String) model.asMap().get("msg"), is("SUCCESS")); } 

但我对此仍然不是很有信心。 如果这个答案有一些缺陷,请留下一些评论来改进/贬低这个答案。