【问题标题】:Testing ModelMap in Spring with JMock使用 JMock 在 Spring 中测试 ModelMap
【发布时间】:2012-11-21 20:06:55
【问题描述】:

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

【问题讨论】:

    标签: spring testing jmock


    【解决方案1】:

    我通常使用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());
    

    【讨论】:

    • 模型是如何实际初始化的?
    • 在超类model = new ExtendedModelMap();的@Before方法中我添加到了例子中
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 关于这些断言我不确定,因为我是新手。我正在尝试测试模型是否包含正确的数据,这里的学生号码是 767001,依赖模拟服务。应该怎么做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多