【问题标题】:Difference between EasyMock.expect(...).times(...) versus using EasyMock.expect(...) several times?EasyMock.expect(...).times(...) 与多次使用 EasyMock.expect(...) 之间的区别?
【发布时间】:2011-09-20 15:53:37
【问题描述】:

这有什么区别:

ResultSet set = EasyMock.createNiceMock(ResultSet.class);
EasyMock.expect(set.getInt("col1")).andReturn(1);
EasyMock.expect(set.wasNull()).andReturn(false);
EasyMock.expect(set.getInt("col2")).andReturn(2);
EasyMock.expect(set.wasNull()).andReturn(false);
EasyMock.replay(set);

assertEquals(1, set.getInt("col1"));
assertEquals(false, set.wasNull());
assertEquals(2, set.getInt("col2"));
assertEquals(false, set.wasNull());

还有这个:

ResultSet set = EasyMock.createNiceMock(ResultSet.class);
EasyMock.expect(set.getInt("col1")).andReturn(1);
EasyMock.expect(set.getInt("col2")).andReturn(2);
EasyMock.expect(set.wasNull()).andReturn(false).times(2);
EasyMock.replay(set);

assertEquals(1, set.getInt("col1"));
assertEquals(false, set.wasNull());
assertEquals(2, set.getInt("col2"));
assertEquals(false, set.wasNull());

?

注意:两组代码都作为 jUnit 测试成功编译和运行。另外,请注意这里故意使用“漂亮”的模拟。

【问题讨论】:

    标签: java unit-testing easymock


    【解决方案1】:

    回答标题中的问题 - 没有区别。调用x.expect(y).times(3)和调用完全一样

    x.expect(y);
    x.expect(y);
    x.expect(y);
    

    (请注意,正如 Andy Thomas-Cramer 所指出的,您的具体示例并不完全等效,因为调用的顺序不同。)

    这似乎只是一个方便问题。然而,除此之外还有一个明显的区别:在times() 的情况下,您可以将预期的调用次数作为变量传递。因此,您可以通过一些外部文件,甚至简单地通过一个公共常量 int 来配置它,您也可以使用它来触发测试工具。这比必须显式编译对expect() 的正确调用次数要灵活得多(如果您现在需要使用五个工作人员而不是三个工作人员进行测试,请更新您的代码)。

    【讨论】:

      【解决方案2】:

      第二个更容易读写。但是,如果将 mock 更改为严格的 mock,调用顺序会被验证,它会失败。

      【讨论】:

      • 所以你基本上是说没有区别,真的吗?我知道如果将其更改为严格,那将很重要。
      • 在成功验证方面没有区别,对于一个很好的模拟 - 但是是的,在可读性/可写性方面有所不同。考虑时间(42)。正如@Andrzej 指出的那样,有时您可能希望将调用次数设为变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2012-11-20
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多