如何使用JUnit测试具有内部私有方法、字段或嵌套类的类?

仅仅为了能够运行测试而更改方法的访问修饰符似乎是不好的。


当前回答

我使用的另一种方法是将私有方法更改为打包私有或受保护的方法,然后使用GoogleGuava库的@VisibleForTesting注释对其进行补充。

这将告诉使用此方法的任何人要小心,即使在包中也不要直接访问它。同样,测试类不需要在物理上位于同一个包中,而是位于测试文件夹下的同一包中。

例如,如果要测试的方法位于src/main/java/mybackage/MyClass.java中,那么您的测试调用应该位于src/test/java/mypackage/MiClassTest.java中。这样,您就可以访问测试类中的测试方法。

其他回答

我和我的团队正在使用Typemock,它有一个API,允许您伪造非公共方法。

最近,他们增加了伪造不可见类型和使用xUnit的能力。

在Spring Framework中,您可以使用以下方法测试私有方法:

ReflectionTestUtils.invokeMethod()

例如:

ReflectionTestUtils.invokeMethod(TestClazz, "createTest", "input data");

从本文:使用JUnit和SuiteRunner测试私有方法(Bill Venners)中,您基本上有4个选项:

不要测试私有方法。授予方法包访问权限。使用嵌套测试类。使用反射。

如果您正在使用JUnit,请查看JUnit插件。它能够忽略Java安全模型并访问私有方法和属性。

私有方法由公共方法调用,因此公共方法的输入也应测试这些公共方法调用的私有方法。当公共方法失败时,这可能是私有方法的失败。