2012-11-21 21 views
2

我是新来JMock的,试图建立一个春天控制器测试。这里是我的测试方法:测试ModelMap春与JMock的

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

回答

0

我通常使用Model接口,然后在测试超类我有一些代码,让我的东西在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()); 
+0

模型如何实际被itialized? – mjgirl

+0

在超类中的'模型=新ExtendedModelMap()的方法@Before;'我把它添加到例如 – blank

0

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

也有这个包将包含在春天3.2可以帮助:https://github.com/SpringSource/spring-test-mvc

但是我一直在使用extendedmodelmap和朴实的hashmaps一直很好。

在你的榜样,你有没有实现的equals(和hashCode)正确,如果你还没有overrridden这些方法,如果对象是相同的参考在断言将测试。

+0

你能提供一个与我的问题匹配的代码示例吗? – mjgirl

+0

关于这些说法我不能确定,因为即时通讯新本。我想,以测试模型包含正确的数据,这里的学生是谁的号码是767001,依托模拟服务。应该怎么做。 – mjgirl