具有许多私有方法的Java测试类

具有许多私有方法的Java测试类,java,unit-testing,junit,integration-testing,spock,Java,Unit Testing,Junit,Integration Testing,Spock,我有一个类负责将合同从CSV导入数据库 类本身只有一个启动导入的公共方法,其他方法都是私有的(因为只有类本身会使用,并且它们持有逻辑) 我开始使用Spock对这个类进行测试,有很多私有方法,我应该如何测试它 我应该把它们公开测试吗?只测试主方法,公共方法 什么是最好的?理论上,您的私有方法最终会被其中一个公共方法使用,否则它们根本不会被使用。因此,通常情况下,您会将测试设置为使用必要的上下文调用公共方法,以便它访问您的私有方法 单元测试主要测试编译单元(即类)。您可以直接对方法进行单元测试,但这

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

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

我开始使用Spock对这个类进行测试,有很多私有方法,我应该如何测试它

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


什么是最好的?

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

单元测试主要测试编译单元(即类)。您可以直接对方法进行单元测试,但这些方法必须是公共的,这与使用一个干净的API是背道而驰的


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

一些人认为您应该只测试您的API(即您的公共方法)

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

就个人而言,我不会测试私有方法,我会专注于公共方法的预期行为。
如果您觉得您的私有方法负担太重,那么它们可能会负担太重,您应该进一步分离功能。

如果您的类实现了一个接口,您可以“公开”所有要测试的方法,但不要将它们添加到接口中。在这种情况下,您将能够从test而不是src访问这些方法。

您可以使用反射来实现这一点。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);

如果需要对这些方法运行JUnit测试,那么它们必须是公共的。这样做会导致任何问题吗?您可以将这些私有方法转换为包方法(而不是公共方法),然后您的测试就必须在同一个包中。我建议您通读这篇文章:Spock测试是用Groovy编写的,这意味着它们可以调用私有(Java)方法。所以这不是一个技术问题,只是一个你是否想去那里的问题。@Ascalonian,它会破坏封装。Thx,我会这样测试!