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

时间:2012-11-27 20:15:53

标签: java junit easymock

在我的代码中,我有时会在同一个类中调用公共或私有方法。这些方法不适合被引入自己的班级。我调用的每种方法都在自己的单元测试中进行测试。

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

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

3 个答案:

答案 0 :(得分:2)

听起来你正在寻找Partial Mocks ......这里有一篇博文,内容涵盖了他们: http://www.jroller.com/alessiopace/entry/partial_mocks_with_easymock

这需要EasyMock ClassExtension,但不幸的是,它无法模拟私有方法。

答案 1 :(得分:0)

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

从测试的角度来看,测试归档的方法如何 (无论是否调用其他方法)都应该没有兴趣。关键点应该是方法执行的状态更改,而不是它调用的方法。

答案 2 :(得分:0)

这可以使用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)您仍然无法定位私有方法,因此您可能希望将它们设置为包私有而非私有。