0

我想模拟MVC design pattern. 我已经实现了MVP(另一个MVC变体),并且想测试当模型上发生状态更改时控制器是否正确调用了视图中的某些方法。下面显示了对model,controller和的方法调用顺序view

模型:

model.setProperty("newProperty");

控制器:

@覆盖
    公共无效propertyChange(PropertyChangeEvent evt){
        对于(查看视图:视图){
            view.modelPropertyChange(evt);
        }
    }

视图:这个结果被称为视图,如下所示:

@覆盖
    公共无效模型PropertyChange(PropertyChangeEvent evt){
        if ("Property".equals(evt.getPropertyName())) {
            更新视图();
        }
    }

问题:如何验证(EasyMockJUnit测试中使用)方法的预期顺序(带有有效参数)执行?我期望view.modelPropertyChange(evt)被调用并期望view.isViewUpdated()返回对象trueview在我的 JUnit 测试中怎么说?请帮忙!

4

1 回答 1

2
@RunWith(JUnit4.class)
public class ControllerTest {
  @Test
  public void updateView() {
    PropertyChangeEvent evt = new PropertyChangeEvent( ... );
    View mockView = EasyMock.createMock(View.class);
    mockView.modelPropertyChange(evt);
    EasyMock.replay(mockView);

    Controller controller = new Controller( ... );
    controller.propertyChange(mockView);
    EasyMock.verify(mockView);
  }
}

请注意,Controller.propertyChange()不会调用View.isViewUpdated(),因此无需模拟isViewUpdated。您将isViewUpdated在该课程的测试中进行测试View

如果propertyChange确实调用isViewUpdated了,那么您将在之前添加以下调用EasyMock.replay()

EasyMock.expect(mockView.isViewUpdated()).andReturn(true);

请注意,EasyMock.createMock()这并不强制按照它们被模拟的顺序调用模拟方法。如果要强制执行方法顺序,请使用EasyMock.createStrictMock()

于 2010-09-13T13:48:15.177 回答