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