【发布时间】:2013-04-05 19:10:05
【问题描述】:
我开始为遗留代码库编写 JUnit 测试用例。其中一个公共方法有多个 if 语句,并根据条件调用不同的私有方法。
我应该只编写一个测试方法并测试所有条件吗? 还是 一个每个条件的方法?
如果我为每个 if 条件编写单独的方法,我会不会失去一致性?
测试私有方法的方法是什么?私有方法逻辑可能比公共方法更复杂。
【问题讨论】:
标签: java unit-testing junit junit4
我开始为遗留代码库编写 JUnit 测试用例。其中一个公共方法有多个 if 语句,并根据条件调用不同的私有方法。
我应该只编写一个测试方法并测试所有条件吗? 还是 一个每个条件的方法?
如果我为每个 if 条件编写单独的方法,我会不会失去一致性?
测试私有方法的方法是什么?私有方法逻辑可能比公共方法更复杂。
【问题讨论】:
标签: java unit-testing junit junit4
方法的数量取决于你要测试的场景的数量,它与被测试的事物所具有的方法无关。
如果每个场景都使用自己的代码进行设置,那么您将获得每个场景的一种测试方法。如果您可以对测试进行参数化,那么您也许可以使用一种测试方法并为每个场景传入不同的数据。
重要的是,对于每个输入组合,您都希望测试独立于其他测试成功或失败。如果您将所有测试硬塞到一个方法中,则不会发生这种情况,第一个测试失败将阻止其余测试运行。
【讨论】:
我同意内森的观点。测试应该通过场景而不是方法。有时遗留代码的编写方式需要您直接测试私有方法。是的,代码应该被重构。但是如果你不能重构或者想要先进行测试......
选项 1 - 使方法包私有访问
这是一个非常安全的重构。
方案二——使用反射直接调用静态方法
如果您真的无法触摸代码,这是您能做的最好的事情。我会质疑不触摸代码的要求。如果我们不能改进代码,我们是否应该把它留在角落里腐烂?
【讨论】:
在我看来,在单元测试中使用较小的单元通常会产生更好的测试。 对您来说,这意味着将私有方法更改为封装私有并为每个方法编写测试。
【讨论】: