【问题标题】:How to mock the view in the MVC integration testing using JUnit and EasyMock如何使用 JUnit 和 EasyMock 在 MVC 集成测试中模拟视图
【发布时间】:2011-04-11 15:59:25
【问题描述】:

我想模拟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())) { 更新视图(); } }

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

【问题讨论】:

    标签: java model-view-controller junit easymock


    【解决方案1】:
    @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。您将在 View 类的测试中测试 isViewUpdated。

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

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

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

    【讨论】:

    • 运行 EasyMock.verify(mockView) 时出现错误:"Expectation failure on verify..."
    • 通常您可以从堆栈跟踪中看出问题所在。上面的代码告诉 EasyMock 期望“modelPropertyChange”将在视图上调用一个等于“evt”的事件。如果您在 EasyMock.verify() 中遇到异常,通常表明该方法没有被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多