Java测试类有很多私有方法

时间:2015-01-15 17:56:59

标签: java unit-testing junit integration-testing spock

我有一个班级负责将合同从CSV导入数据库。

类本身只有一个开始导入的公共方法,其他方法都是私有的(因为只有类本身会使用,并且它们保持逻辑)。

我开始使用Spock为这个类进行测试,并且有很多私有方法,我该如何测试呢?

我应该把它们变成公开测试吗?只测试主要方法,公共方法?

什么是最好的?

4 个答案:

答案 0 :(得分:12)

理论上,您的私有方法最终会被其中一种公共方法使用,否则根本就不会使用它们。因此,通常设置测试以使用必要的上下文调用公共方法,以便它可以访问您的私有方法。

单元测试主要测试编译单元(即类)。你可以直接对测试方法进行单元测试,但是它们必须是公共的,这与一个干净的API相反。

因此,测试您的公共方法足以击中所有私有方法。私有方法是类的内部机制,它们不需要直接测试。

答案 1 :(得分:2)

有些人认为你应该只测试你的API(。你的公共方法)。

一种可能的解决方案是使用package private,这样只有同一个包中的类才能访问这些方法。

就个人而言,我不会测试私有方法,我会专注于按预期行事的公共方法。 如果你觉得你的私人方法承担了太多的重量,那么他们可能会这样做,你应该进一步分离这些功能。

答案 2 :(得分:1)

您可以使用反射来实现此目的。 Method类有一个名为setAcessible(boolean)的方法,即使声明为private / protected / default,也可以调用它。请参阅以下示例:

YourClass yourClassInstance = new YourClass();
Method yourMethod = YourClass.class.getDeclaredMethod("yourMethod", null);
yourMethod.setAccessible(true);
Object[] parameters = new Object[1];
parameters[0] = "A String parameter";
Object result = yourMethod.invoke(yourClassInstance, parameters);

答案 3 :(得分:0)

如果您的班级实现了一个界面,您可以制作" public"您喜欢测试的所有方法,但不要将它们添加到接口。在这种情况下,您将能够从测试中访问这些方法,但不能从您的src访问。

相关问题