当前位置: 首页 > 知识库问答 >
问题:

EasyMock——测试类中的模拟方法?

羊舌高爽
2023-03-14

在我的代码中,我有时在同一个类中调用public或private方法。这些方法并不是一个很好的候选方法,不适合被拉入自己的类中。我调用的每个方法都在它们自己的单元测试中进行测试。

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

如果没有,通常的解决方案是什么?

共有3个答案

巫马松
2023-03-14

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

从测试的角度来看,您正在测试的方法如何归档预期状态(无论它是否调用其他方法)都不应该引起兴趣。基本兴趣点应该是方法执行的状态的结果变化,而不是它为此调用了哪些方法。

宋健柏
2023-03-14

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

此处记录了部分模拟:

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

语法相当简单。您可以指定要模拟的类以及要模拟的方法。在本例中,假设该类是“Dog”,它有两个方法“eat”和“eatUntilFull”。您可以将此代码放入EatutilFull测试中:

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

然后,你可以像对待其他嘲笑一样对待它。

注意事项:

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

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

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

宁卓
2023-03-14

听起来你在寻找部分模仿...这里有一篇博客文章涵盖了它们:http://www.jroller.com/alessiopace/entry/partial_mocks_with_easymock

这需要EasyMock类扩展,不幸的是,它不能模拟私有方法。

 类似资料:
  • 在我的代码中,我有时在同一个类中调用公共或私有方法。这些方法不适合被拉到自己的类中。我调用的这些方法中的每一个都是在它们自己的单元测试中进行测试的。 那么,如果我的类a中有一个方法,它也调用类a中的每个方法,那么有什么方法可以模拟这些调用吗?我当然可以剪切和粘贴我的期望/模拟行为,但这不仅是乏味的,它混淆了测试的重点,违反了模块化,并且由于无法控制返回的内容而使测试更加困难。 如果不是,这种事情通

  • 我尝试从以下方法创建单元测试,但我找不到一个解决方案来模拟每个方法内的调用,请您帮助我使用EasyMock为这些方法创建JUnit Test: 提前感谢

  • 问题内容: 假设我有一个像这样的课程: 如何使用简单的模拟方法模拟静态方法调用?。 我正在使用简单的模拟3.0 问题答案: 不知道如何使用纯EasyMock,但可以考虑使用EasyMock 的PowerMock扩展。 它具有很多很酷的功能,可以满足您的需要 -https://github.com/jayway/powermock/wiki/MockStatic

  • 问题内容: 是否可以使用EaskMock模拟具体的类?如果是这样,我该怎么办? 问题答案: 请参阅EasyMock类扩展文档,并从SourceForge项目下载它。但是,您不能模拟最终方法。 编辑:如注释中所述,这是EasyMock v3及更高版本的一部分。

  • 我有以下场景: 我想在测试中覆盖公共方法methodA()的catch块。我不想更改私有方法的可见性。是否有任何方法可以使用EasyMock实现私有方法的部分模拟?或者有没有办法改变Junit类中私有方法的行为,以便在不使用mocking的情况下抛出异常? 提前谢谢。

  • 模拟由某个类实现的接口方法很容易,但如果有一个类并且有一个静态方法,那么我们如何借助easymock对其进行模拟呢?? supose是一个a类,有一个void retruned方法作为公共静态void methodA(一些参数…){} 我们如何在EasyMock的帮助下模仿A的方法methodA