Java 将私有方法更改为受保护的测试方法

Java 将私有方法更改为受保护的测试方法,java,junit,Java,Junit,将私有方法更改为protectedforjunit测试是一个好主意吗?有时是有用的,是的 如果该类是可扩展的,请确保该方法为final 另外,记录一个事实,即该方法不应该由同一包的子类或外部类调用 我使用Guava@VisibleForTesting注释来明确方法实际上应该是私有的。您可以将方法包改为本地的 您可以使用反射调用private方法,或者您可以决定不应该直接测试private方法,只能间接测试。一般来说,不应该。单元测试的思想是测试。。。单位。或者换句话说,接口方法的实现。 如果你想

将私有方法更改为protectedforjunit测试是一个好主意吗?

有时是有用的,是的

如果该类是可扩展的,请确保该方法为final

另外,记录一个事实,即该方法不应该由同一包的子类或外部类调用


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

您可以将方法包改为本地的


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

一般来说,不应该。单元测试的思想是测试。。。单位。或者换句话说,接口方法的实现。 如果你想测试一个你看不到的方法,这可能是一种代码味道。也许您没有将业务逻辑与UI代码或其他东西充分分离


因此,最好的办法是重新思考您的架构。但是,如果替代方案是不测试代码,那么最好保护这些方法。

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


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

为什么要这样做?你在测试前改变了一些东西,我看不出有什么原因?几乎肯定不是个好主意;如果你直接测试一个类的内部方法,你应该考虑将它们重构成一个单独的类。在私有方法返回一些在单元测试环境中不可用的资源的情况下,我已经这样做了,并且我想测试调用它的其他(非私有)方法。通过对其进行保护,我可以覆盖它,以便它返回一些存根/模拟,而不是不可用的资源。这意味着一个单元测试将变得可行,我无法找到另一种方法来解决这个问题,但它并不理想。是的,它不太理想,但如果其他解决方案太麻烦的话,就去做吧。理想情况下,您将有一种不必更改类就可以模拟资源的方法。制作可测试代码确实会影响像这样的设计选择。默认范围比受保护的范围好。感谢您打开我的眼睛看@VisibleForTesting。我不知道这个存在。它仍然觉得这有点不完善,因为它仅仅为了测试的目的而影响实现的语法,但是它比公开应该是私有的成员和方法要好。将测试局限于接口方法似乎是一种过于严格的限制,有时是不实际的限制。