假设我有一个看起来像这样的方法:
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(...);
因为我想测试公共方法,但我不想进入私有方法并测试里面的实现。
由于
答案 0 :(得分:13)
不要这样做。 良好的单元测试的一个基石是它应该尽可能少地依赖于实现细节。嘲笑私有方法就是这样。
为什么呢? 因为这会使你的单元测试变得非常脆弱。考虑一下你在一周内回到这段代码的情况,并确定你真的不需要方法parseFoo2,而你实际上想要内联它的代码。或者您想将此方法拆分为两个或更多较小的方法。所有非常有效的重构实践 - 但它们将打破单元测试!
每次进行简单的重构时,您都不希望追逐单元测试。因此,模拟私有方法被认为是不好的做法。
答案 1 :(得分:7)
如果您发现必须模拟私有方法,那么您可以使用PowerMock.expectPrivate()
。 EasyMock无法模仿私人方法。
答案 2 :(得分:0)
如果您仍想使用EasyMock,因为更改它并不依赖于您(在企业中工作),您可以使用反射来更改方法返回的私有字段,或者任何私有字段。
例如,您可以在辅助类中使用这些方法。并根据需要使用它们。