使用仅返回视图名称的方法对spring 3控制器进行单元测试

时间:2011-09-20 08:47:05

标签: java unit-testing spring controller

我的理解是,对弹簧控制器进行单元测试的有效方法是简单地实例化一个新实例(所需控制器)并直接测试控制器方法。不打扰Mock请求等,因为spring本身确实需要测试。

但是,我的许多控制器方法只是将视图名称作为单个String返回,我想测试模型本身是否具有正确的参数和数据。

我是否需要更改方法以便它们返回ModelAndView,以便我可以在单元测试中访问模型?我的方法应该这样做(返回模型和视图)吗?

当我在控制器方法中创建一个新的ModelAndView时,现有的Model会被覆盖吗?

1 个答案:

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

我不知道该模型是否被覆盖。

这是我从一个小项目中获得的经验,所以我绝不是专家,但我发现这种方法很有用。