【问题标题】:EasyMock -- mock methods within tested class?EasyMock——测试类中的模拟方法?
【发布时间】:2012-11-27 20:15:53
【问题描述】:

在我的代码中,我有时会在同一个类中调用公共或私有方法。这些方法不适合被拉到自己的类中。我调用的这些方法中的每一个都在它们自己的单元测试中进行了测试。

那么,如果我的类 A 中有一个方法调用类 A 中的每个方法,有什么方法可以模拟这些调用吗?我当然可以剪切和粘贴我的期望/模拟行为,但这不仅乏味,而且混淆了测试的重点,违反了模块化,并且由于无法控制返回的内容而使测试更加困难。

如果不是,这种事情的通常解决方案是什么?

【问题讨论】:

  • 换个问题。您应该测试调用第一个方法的效果,而不是第一个方法调用其他方法。
  • 你有什么理由不能让你的方法正常调用其他方法吗?
  • @DNA 他们中的许多人都拨打了必须模拟的电话。
  • @LouisWasserman 我看不出区别。我正在尝试测试该方法,但必须“重新测试”他们为此调用的方法。

标签: java junit easymock


【解决方案1】:

听起来您正在寻找 Partial Mocks...这是一篇涵盖它们的博客文章: http://www.jroller.com/alessiopace/entry/partial_mocks_with_easymock

这需要 EasyMock ClassExtension,但遗憾的是它不能模拟私有方法。

【讨论】:

【解决方案2】:

这可以通过 EasyMock 2.2 类扩展或 EasyMock 3.0 及更高版本(包括类扩展)来完成。

此处记录了部分模拟:

http://www.easymock.org/EasyMock2_2_2_ClassExtension_Documentation.html

语法相当简单。您指定要模拟的类以及要模拟的方法。在这个例子中,假设类是“Dog”,它有两个方法,“eat”和“eatUntilFull”。你可以把这段代码放在eatUntilFull测试中:

mockDog = createMockBuilder(Dog.class).addMockedMethod("eat").createMock();

然后您可以像对待任何其他模拟一样对待它。

注意事项:

1) 在你的类中从另一个类中调用一个方法可能表明设计不佳——你能将该逻辑抽象到另一个类中吗?

2) 即使你不能,在测试期间让你的方法自己调用另一个方法也可能没有问题。这可能是首选行为。

3) 您仍然无法定位私有方法,因此您可能希望将它们设置为包私有而不是私有。

【讨论】:

    【解决方案3】:

    一般来说,如果您需要模拟私有方法(或您正在测试的同一个类上的公共方法),您应该考虑将该方法中的代码移至另一个类。

    从测试的角度来看,您正在测试的方法如何归档预期状态应该是无关紧要的(无论它是否调用其他方法)。关注的基本点应该是方法执行的状态变化,而不是它调用的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多