5

可以说我有一个看起来像这样的方法:

public static String[] parseFoo(Foo anObject){
    Foo anotherObject = parseFoo2(anObject);
...
}

private static Foo parseFoo2(Foo anObject){
...
}

并且这两种方法都在同一个类中。parseFoo2 只是一个帮助 parseFoo 完成一些工作的辅助方法。我正在尝试测试方法 parseFoo。EasyMock 中是否有人可以为 parseFoo2 指定该私有方法调用的返回值,就像我可以为对象指定实例方法调用一样

EasyMock.createMock(...);
anObject.expect(...).andReturn(...);

因为我想测试公共方法,但我不想进入私有方法并测试里面的实现。

谢谢

4

3 回答 3

13

不要这样做。一个好的单元测试的基石之一是它应该尽可能少地依赖于实现细节。模拟一个私有方法就是这样。

为什么?因为这会使您的单元测试非常脆弱。考虑一下您在一周后返回此代码并确定您实际上并不需要方法 parseFoo2 并且您实际上想要内联其代码的情况。或者您想将此方法拆分为两个或多个较小的方法。所有非常有效的重构实践——但它们会破坏单元测试!

您不希望每次进行这样的简单重构时都进行单元测试。因此,模拟私有方法被认为是不好的做法。

于 2012-08-06T18:50:21.427 回答
9

如果你发现你必须模拟一个私有方法,那么你可以使用PowerMock.expectPrivate(). EasyMock 不能模拟私有方法。

于 2012-08-06T18:54:26.693 回答
0

如果您仍然想使用 EasyMock,因为更改它不取决于您(在企业中工作),您可以使用反射来更改您的方法返回的私有字段,或任何私有字段。

例如,您可以在帮助程序类中使用这些方法。并根据需要使用它们。

于 2013-01-16T11:17:46.153 回答