2012-04-13 92 views
8

将私有方法更改为受保护以进行JUNIT测试是一个不错的主意。将私有方法更改为受保护以进行测试

+0

为什么要这样呢?在测试之前你改变了一些东西,我看不出有什么理由呢? – Nanne 2012-04-13 13:23:07

+2

几乎肯定不是一个好主意;如果你直接测试一个类的内部方法,你应该考虑将它们重构成一个单独的类。 – 2012-04-13 13:24:19

+0

我在私有方法返回单元测试环境中不可用的某些资源的情况下完成了此操作,并且我想测试一些调用它的其他(非私有)方法。通过使其受到保护,我可以覆盖它,以便它返回一些存根/模拟而不是不可用的资源。这意味着一个单元测试变得可行,我还没有找到另一种方法,但它不是理想的。 – 2012-04-13 13:27:23

回答

9

有时候有用,是的。

如果类是可扩展的,请确保使方法最终。

另外,记录该方法不应该被相同包的子类或外部类调用的事实。

我使用Guava @VisibleForTesting注释来说明该方法实际上应该是私有的。

+0

感谢您打开我的眼睛@VisibleForTesting。我不知道这存在。它仍然觉得这有点不完美,因为它仅仅为了测试的目的而影响实现的语法,但它比暴露应该是私有的成员和方法要好。而限制测试接口方法似乎是一个过分严格,有时不切实际的限制。 – Lolo 2013-01-18 18:06:50

4

您可以将方法打包为本地。

您可以使用反射调用私有方法,或者您可以决定不应该直接测试private方法,只能间接测试。

5

总的来说不是。单元测试的想法是测试单位。换句话说,接口方法的实现。 如果你想测试一个你不能“看到”的方法,这可能是一种代码异味。也许你没有把你的业务逻辑从UI代码中分离出来。

所以最好的想法是重新考虑你的架构。但是,如果替代方法是不测试代码,那么保护这些方法是个好主意。

1

尽管您应该更喜欢按照@ user714965的建议进行重构,但PowerMock的MockPrivate可以在不打开私有方法的情况下进行模拟。

首先编写测试通常会导致您不需要模拟私有方法的设计。