您如何使用以下代码获得100%的代码覆盖率?
- (void)methodA {
mState = Active;
// do something ...
methodB();
}
- (void)methodB {
if (mState != Active) return;
// do something else ...
}
我可以轻松测试do something
和do something else
部分,问题出在if (mState != Active) return;
行methodB
。由于methodA
总是将状态设置为Active
,因此永远不会执行早期返回。
我有早期的返回代码,以防将来在其他地方调用methodB
。如果mState
不是Active
,则执行代码没有意义,所以它或多或少都是防御性编码。
我可以在方法中添加注释,声明“此方法假定状态为活动”或其他内容,但这并未强制执行状态必须处于活动状态的合同。抛出异常和/或声明也可能是这里的可能性,但我不知道如何测试它以获得100%的代码覆盖率。
我完全明白,对于这样的情况,获得100%的代码覆盖率可能无关紧要 - 但不幸的是,获得的决定不是我的(至少现在)。 “老板”希望这样做,如果你问我,这对你来说是不合理的!
答案 0 :(得分:1)
首先:不要过于挂掉100%的报道。您可以花费大量时间来覆盖数字,而无需为您的产品添加更多“质量”!
含义:如果100%的目标来自外部驱动程序,则可能值得退一步讨论严格的100%目标是否真的有帮助(我认为它没有,但更多的是意见)。
假设您希望获得100%的覆盖率,我看到只看到一个选项:
您启用测试A)将mState
设置为除Active
和B之外的其他内容,以便能够在不经过方法methodB()
的情况下调用methodA()
。
例如,通过为该字段设置一个setter;并使methodB()
至少包受保护,以便单元测试可以调用该方法。但是,您正在对您的生产代码进行“仅测试”更改 - 仅仅是为了达到这个神奇的100%数字。
如果mState
不是字段,但是会被getter返回,那么可能可以使用Mockito间谍和部分模拟。