【问题标题】:EasyMock expect method to return multiple, different objects in same testEasyMock 期望方法在同一个测试中返回多个不同的对象
【发布时间】:2011-10-18 17:37:17
【问题描述】:

我正在使用 EasyMock 对我的 Java 代码进行单元测试。我要测试的类是一个 RESTful webservice API 层。 API 有一个在 API 测试中被模拟的底层服务层。我的问题是弄清楚如何正确地对我的editObject(ID, params...) API 方法进行单元测试,因为它调用service.getById() 两次并期望每次调用都返回一个不同的对象。

editObject(ID, params...) 首先尝试从服务层获取对象以确保 ID 有效(第一次调用期望的service.getById(ID),返回原始未修改的对象)。接下来,它修改 API 调用中指定的参数,将其保存到服务中,然后再次调用 get 以将服务管理的修改对象交给调用者(第二次 service.getbyId(ID) 调用期望,返回修改后的对象)。

有没有办法用 EasyMock 来表示这个?

【问题讨论】:

    标签: java unit-testing easymock


    【解决方案1】:

    当然,您可以对使用相同方法和参数的两个方法调用执行两种不同的操作。只需按照您期望它们发生的顺序声明您的期望并相应地设置响应。

    expect(mockService.getById(7)).andReturn(originalObject).once();
    expect(mockService.getById(7)).andReturn(modifiedObject).once();
    replay(mockService);
    

    .once() 是可选的,但我发现在这种情况下它更具自我记录性。

    【讨论】:

      【解决方案2】:

      您可以链接多个andReturn 方法调用:

      EasyMock.expect(service.getById(1))
          .andReturn(firstObject)
          .andReturn(secondObject);
      

      第一次以1 作为参数调用service.getById,模拟将返回firstObject,第二次调用secondObject。您可以根据需要链接任意数量,甚至可以通过andThrow 为特定调用抛出异常。

      【讨论】:

      • 第三次呢?和andStubReturn一样吗?
      【解决方案3】:

      这种技术在条件表达式中也很有帮助,您可能希望在其中使第一个条件无效但通过第二个条件,反之亦然。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 1970-01-01
        相关资源
        最近更新 更多