Junit最佳实践:公共方法调用多个私有方法

5
我开始为一个旧代码库编写JUnit测试用例。其中一个公共方法有多个if语句,根据条件调用不同的私有方法。
我是应该只编写一个测试方法并对所有条件进行测试吗?还是每个条件都写一个独立的测试方法? 如果为每个if条件编写单独的方法,那么我不会失去一致性吗?
如何测试私有方法?私有方法的逻辑可能比公共方法更复杂。
3个回答

4

根据您要测试的场景数量确定方法的数量,这与被测试对象具有的方法无关。

如果每个场景都需要自己的代码来设置,那么每个场景将会得到一个测试方法。如果您可以对测试进行参数化,则可以拥有一个测试方法并为每个场景传递不同的数据。

重要的是,对于每个输入组合,您希望测试能够独立地成功或失败,而不受其他测试的影响。如果您将所有测试都塞到一个方法中,那么这种情况就不可能发生,第一个测试失败将会阻止剩余的测试运行。


1

我同意Nathan的观点,测试应该按照场景而不是方法进行。有时遗留代码以一种需要直接测试私有方法的方式编写。是的,代码应该重构。但是如果你无法重构或想要先进行测试...

选项1 - 使方法包私有访问

这是一个非常安全的重构。

选项2 - 使用反射直接调用静态方法

如果你真的不能触碰代码,那么这是你能做到的最好的。我会质疑不触碰代码的要求。如果我们无法改进代码,那么我们应该把它放在角落里腐烂吗?


1
也许使用Groovy编写测试(它不尊重隐私)可能是另一个选择。 - Nathan Hughes

0

在我看来,将单元测试分成更小的单元通常会得到更好的测试结果。 对于您来说,这意味着将私有方法更改为包内访问权限,并为每个方法编写测试。


做不到。这是遗留代码,其中一些逻辑不能公开。 - Himanshu Yadav
我不会将它更改为公共的,而是改为包级私有,并确保测试在同一个包中(通过分离生产和测试源代码)。 - user2088476

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接