EasyMock期待私有方法调用

时间:2012-08-06 18:38:35

标签: java unit-testing easymock

假设我有一个看起来像这样的方法:

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(...);

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

由于

3 个答案:

答案 0 :(得分:13)

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

为什么呢? 因为这会使你的单元测试变得非常脆弱。考虑一下你在一周内回到这段代码的情况,并确定你真的不需要方法parseFoo2,而你实际上想要内联它的代码。或者您想将此方法拆分为两个或更多较小的方法。所有非常有效的重构实践 - 但它们将打破单元测试!

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

答案 1 :(得分:7)

如果您发现必须模拟私有方法,那么您可以使用PowerMock.expectPrivate()。 EasyMock无法模仿私人方法。

答案 2 :(得分:0)

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

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