我的理解是,对弹簧控制器进行单元测试的有效方法是简单地实例化一个新实例(所需控制器)并直接测试控制器方法。不打扰Mock请求等,因为spring本身确实需要测试。
但是,我的许多控制器方法只是将视图名称作为单个String返回,我想测试模型本身是否具有正确的参数和数据。
我是否需要更改方法以便它们返回ModelAndView,以便我可以在单元测试中访问模型?我的方法应该这样做(返回模型和视图)吗?
当我在控制器方法中创建一个新的ModelAndView时,现有的Model会被覆盖吗?
答案 0 :(得分:2)
我会尝试回答你的一些问题。
关于对控制器进行单元测试,有时我发现需要添加Spring的Mock请求和响应,因为一些spring功能需要请求上下文中的请求和响应。
class MyTest {
private MockHttpServletRequest request;
private MockHttpServletResponse response;
@BeforeMethod(alwaysRun = true)
public void setup() {
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
controller = new Controller( /*inject dependencies here*/ );
}
}
这很容易理解,因为如果它们不在那里,你会得到一个非常具体的错误,说请求或响应不在上下文中。
与模型相关,我发现更容易返回ModelAndView并添加一些检查输出参数和视图名称的测试。
public void shows_xxx_index_view {
assertThat(modelAndView.getViewName(), equalTo("controller/index"));
}
public void model_contains_search_results {
assertThat(modelAndView.getModelMap().get("searchResults"), equalTo(expected_results));
}
我不知道该模型是否被覆盖。
这是我从一个小项目中获得的经验,所以我绝不是专家,但我发现这种方法很有用。