Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JUnit和EasyMock模拟MVC集成测试中的视图_Java_Model View Controller_Junit_Easymock - Fatal编程技术网

Java 如何使用JUnit和EasyMock模拟MVC集成测试中的视图

Java 如何使用JUnit和EasyMock模拟MVC集成测试中的视图,java,model-view-controller,junit,easymock,Java,Model View Controller,Junit,Easymock,我想模拟MVC设计模式的视图实现。我已经实现了MVP(另一个MVC变体),并且想测试当模型发生状态更改时,视图中的某些方法是否被控制器正确调用。下面显示了模型、控制器和视图上方法调用的顺序 型号: model.setProperty("newProperty"); model.setProperty(“newProperty”); 控制器: @Override public void propertyChange(PropertyChangeEvent evt) { fo

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

型号:

model.setProperty("newProperty"); model.setProperty(“newProperty”); 控制器:

@Override public void propertyChange(PropertyChangeEvent evt) { for (View view : views) { view.modelPropertyChange(evt); } } @凌驾 公共作废属性更改(属性更改事件evt){ 用于(视图:视图){ view.modelPropertyChange(evt); } } 视图: 此结果与调用的视图类似:

@Override public void modelPropertyChange(PropertyChangeEvent evt) { if ("Property".equals(evt.getPropertyName())) { updateView(); } } @凌驾 公共无效模型PropertyChange(PropertyChangeEvent evt){ if(“Property”.equals(evt.getPropertyName())){ updateView(); } } 问题:如何验证(在
JUnit
测试中使用
EasyMock
)方法(带有有效参数)的预期执行顺序?我期望调用
view.modelPropertyChange(evt)
,并期望
view.isViewUpdated()
视图
对象上返回
true
。在JUnit测试中,我该怎么说?请帮忙

@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

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


请注意,
EasyMock.createMock()
不强制按模拟的顺序调用模拟的方法。如果希望强制执行方法顺序,请使用
EasyMock.createStrictMock()

我在运行EasyMock.verify(mockView)时出错:“验证时预期失败…”通常可以从堆栈跟踪中看出问题所在。上面的代码告诉EasyMock,希望通过一个等于“evt”的事件在视图上调用“modelPropertyChange”。如果EasyMock.verify()中出现异常,通常表示未调用该方法。
EasyMock.expect(mockView.isViewUpdated()).andReturn(true);