我正在测试一个需要多个参数的函数,并根据它们的值调用不同的私有方法。
我想检查函数是否总是调用正确的私有方法。
由于我知道私有方法会做什么,我可以检查最终结果,但是如果能够直接检查是否调用了正确的函数会更方便,因为我已经测试了私有方法。
有没有办法用存根替换privae方法?
答案 0 :(得分:2)
是的,有一些模拟库可以让你这样做。一个是PowerMock。从private method tutorial开始,你需要这样的东西:
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyUnit.class)
public class TestMyUnit {
@Test
public void testSomething() {
MyUnit unit = PowerMock.createPartialMock(MyUnit.class, "methodNameToStub");
PowerMock.expectPrivate(unit, "methodNameToStub", param1).andReturn(retVal);
EasyMock.replay(unit);
unit.publicMethod(param1);
EasyMock.verify(unit);
}
}
然而,我自己真的不同意这种做法。您的单元测试应该测试输入,输出和副作用,就是这样。通过确保正确调用私有方法,您所做的就是阻止您的代码轻松重构。
换句话说,如果您希望改变 您的单位如何完成工作,那该怎么办?执行此操作的安全方法是确保代码在(传递)测试下,然后重构代码(可能包括更改调用哪些内部方法),然后再次运行测试以确保您没有破坏任何内容。使用您的方法,这是不可能的,因为您的测试测试的确切实现,而不是单元本身的行为。重构几乎总会破坏测试,那么测试真正给你带来了多少好处呢?
大多数情况下你会想要这样做,因为你实际上是把这些私有部分视为一个单位(这听起来像你,因为你说你已经直接测试了那些私有方法!)。如果是这种情况,最好将该逻辑提取到自己的类中,对其进行测试,然后在剩余的代码中与该新单元的模拟/存根版本进行交互。如果你这样做,你的代码有一个更好的结构,你不需要依靠伏击魔法即PowerMock。迈克尔·费尔斯(Michael Feathers)Working Effectively with Legacy Code提供了进行这些重构的绝佳参考。
答案 1 :(得分:0)
您可以检查java检测以执行此操作
答案 2 :(得分:0)
因为其中一个解决方案可以使用内部类的代理。您需要在每个必须测试的类中添加内部类。 但对于大型产品项目来说,这不是很好的解决方案。它需要创建添加脚本来从发布文件中删除生成的类(jar / war)。
但更简单的方法将使用PowerMock,如下面的评论所写(或上面:)) - http://code.google.com/p/powermock/wiki/MockPrivate
答案 3 :(得分:0)
是否有可能向相关类提供另一个对象,私有方法被移动并公开?在这种情况下,为该接口创建测试假人很容易。
答案 4 :(得分:0)
如果调用正确的“私有方法”没有可观察到的外部结果,您确定要测试吗?也许不应该。
如果最终结果是相同的,无论是否调用了私有方法,并且您仍然希望观察其调用,您可以将该方法设置为public并将其移动到自己的类,并模拟该类。然后你可以验证(使用Mockito或类似的框架)是否正在调用你的方法。
答案 5 :(得分:0)
代码覆盖工具通过在实际运行测试之前重写字节码来完成此类操作。所以,它必须是可能的,但这并非易事。
更新:编写一个单元测试,要求调用“正确”的私有方法,这会使重构工作变得非常痛苦,因为那时你必须重新编写所有的测试。这种做法违背了测试的目的。