2012-11-21 48 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