使用JMock在Spring中测试ModelMap

时间:2012-11-21 09:20:57

标签: spring testing jmock

我是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那样灵活。我无法访问模型属性,因此这里的最后一行代码不是它应该如何。

2 个答案:

答案 0 :(得分:0)

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

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

但是我使用extendedmodelmap和普通的hashmaps一直很好。

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

答案 1 :(得分: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());