2015-01-15 70 views
7

我有一个类负责将合约从CSV导入数据库。有很多私有方法的Java测试类

类本身只有一个启动进口和其他方法都是私有的(因为只有类本身会用,而他们,保持逻辑)的公共方法。

我开始让使用斯波克和有很多私人的方法这个类的测试,我应该怎么测试呢?

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

什么是最好的?

+0

如果您需要对这些方法运行JUnit测试,它们需要是“public”。这会导致任何问题吗? – Ascalonian 2015-01-15 18:00:04

+1

您可以将这些私有方法变成包方法(而不是公共方法),然后您的测试必须位于同一个包中。 – Gus 2015-01-15 18:00:31

+1

我推荐阅读这个SO帖子:http://stackoverflow.com/questions/105007/should-i-test-private-methods-or-only-public-ones – 2015-01-15 18:00:34

回答

11

从理论上讲,你的私有方法最终将被一种公共方法所使用,否则它们根本不会被使用。因此,通常你会设置你的测试以调用具有必要上下文的公共方法,以便它触及你的私有方法。

单元测试主要是测试编译单元(即类)。你可以直接对单元测试方法进行单元测试,但是必须公开,这不利于使用干净的API。

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

+0

Thx,我会像那样测试! – 2015-01-15 18:16:28

2

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

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

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

0

如果你的类实现一个接口,你可以让你喜欢的测试“公共”的所有方法,但不添加它们的接口。在这种情况下,您将能够从测试中访问这些方法,但不能从您的src中访问。

1

您可以使用反射来实现此目的。 Method类有一个名为setAccessible(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);