2

我是 JMock 的新手,正在尝试开发 Spring 控制器测试。这是我的测试方法:

@Test
public void testList() {
    context.checking(new Expectations() {{
        Student student = new Student(767001);
        oneOf(studentService).getByNumber(767001); will(returnValue(student));
    }});    


    ModelMap model = new ModelMap();
    Student student = new Student(767001);
    model.addAttribute("student", student);
    CourseRightController instance = new CourseRightController();
    request.setMethod("GET");

    Assert.assertEquals(studentService.getByNumber(767001),model.get(student));

问题是我如何能够测试模型是否包含正确的对象和对象值?ModelMap 不如 ModelAndWiew 灵活。我无法访问模型属性,所以这里的最后一行代码不应该是这样。

4

2 回答 2

0

您可以使用扩展模型映射来获得更大的灵活性。你应该使用接口而不是实现来声明引用。

spring 3.2 中还包含这个包,这可能会有所帮助:https ://github.com/SpringSource/spring-test-mvc

但是,我一直很好用extendedmodelmap和普通的旧hashmaps

在您的示例中,您是否正确实现了equals(和哈希码),如果您没有覆盖这些方法,assertEquals 将测试对象是否是相同的引用。

于 2012-11-21T09:34:01.570 回答
0

我通常使用Model接口,然后在一个测试超类中我有代码,可以让我在模型中得到东西

@Ignore
public abstract class SpringControllerTestCase {
    /**
     * Spring Model object - initialised in @Before method.
     */
    private Model model;

    /**
     * Initialise fields before each test case.
     */
    @Before
    public final void setUpAll() {
       model = new ExtendedModelMap();
    }

    public final Model getModel() {
        return model;
    }

    @SuppressWarnings("unchecked")
    public <T> T getModelValue(final String key, final Class<T> clazz) {
        return (T) getModel().asMap().get(key);
    }

}

然后在测试中我可以做

assertEquals("someValue", getModelValue("bean", String.class));

或者

assertTrue(getModelValue("student", Student.class).getId() == "767001");

请注意,这只是这样的代码的简写

Student student = (Student) model.asMap().get("student");
assertEquals(767001, student.getId());
于 2012-11-21T10:49:42.940 回答