Java 使用许多私有方法测试 class

Java test class with many private methods

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

class本身只有一个public方法启动导入,其他方法都是私有的(因为只有class本身会用到,而且他们持有逻辑).

我开始使用 Spock 对此 class 进行测试,并且有很多私有方法,我应该如何测试它?

我应该把它们变成 public 来测试吗?只测试主要方法,public one?

最好的是什么?

理论上,您的私有方法最终会被 public 方法之一使用,否则它们根本不会被使用。因此,通常您将测试设置为使用必要的上下文调用 public 方法,以便它命中您的私有方法。

单元测试主要是测试编译单元(即class)。您可以直接对方法进行单元测试,但它们必须是 public,这与干净整洁 API.

背道而驰

所以测试你的 public 方法足以命中所有私有方法。私有方法是 class 的内部机制,不需要直接测试。

有些人认为您应该只测试您的 API(。您的 public 方法)。

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

就个人而言,我不会测试私有方法,我会专注于按预期运行的 public 方法。 如果您觉得您的私有方法负担过重,那么也许它们确实如此,您应该进一步分离功能。

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

您可以使用反射来实现这一点。方法 class 有一个名为 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);