2

私は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ほど柔軟ではありません。モデル属性にアクセスできないため、ここの最後のコード行は本来あるべき姿ではありません。

4

2 に答える 2

0

代わりに拡張モデルマップを使用して、柔軟性を高めることができます。また、実装ではなくインターフェースを使用して参照を宣言する必要があります。

Spring 3.2に含まれるこのパッケージもあります:https ://github.com/SpringSource/spring-test-mvc

ただし、 extendedmodelmapとプレーンな古いハッシュマップを使用することは常に問題ありません。

あなたの例では、equals(およびハッシュコード)を正しく実装しましたか?これらのメソッドをオーバーライドしていない場合、assertEqualsはオブジェクトが同じ参照であるかどうかをテストします。

于 2012-11-21T09:34:01.570 に答える
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());
于 2012-11-21T10:49:42.940 に答える