Java 使用只返回视图名称的方法对Spring3控制器进行单元测试

Java 使用只返回视图名称的方法对Spring3控制器进行单元测试,java,unit-testing,spring,controller,Java,Unit Testing,Spring,Controller,我的理解是,对spring控制器进行单元测试的一种有效方法是过于简单地实例化(所需控制器的)一个新实例并直接测试控制器方法。不用担心模拟请求等,因为spring本身确实需要测试 然而,我的许多控制器方法只是将视图名称作为单个字符串返回,我想测试模型本身是否具有正确的参数和数据 我是否需要更改这些方法,以便它们返回ModelAndView,这样我就可以在单元测试中访问模型?我的方法是否应该这样做(返回模型和视图) 在控制器方法中创建新模型和视图时,现有模型是否被覆盖?我将尝试回答您的一些问题 关于

我的理解是,对spring控制器进行单元测试的一种有效方法是过于简单地实例化(所需控制器的)一个新实例并直接测试控制器方法。不用担心模拟请求等,因为spring本身确实需要测试

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

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


在控制器方法中创建新模型和视图时,现有模型是否被覆盖?

我将尝试回答您的一些问题

关于控制器的单元测试,有时我发现需要添加Spring的模拟请求和响应,因为一些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));
}
我不知道模型是否被覆盖了

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