下面是我必须编写单元测试的一个类中的示例switch语句.我从下面的代码中删除了每种情况下的逻辑.
switch (insurance.getInsuranceType()) { case None:{ break;} case Health: { break;} case Auto:{ break;} case WorkersCompensation:{ break;} default:{} }
我必须覆盖每个交换机路径,但要到达此交换点的功能进行测试,我必须放置10个小时和相应的验证语句(我使用Mockito进行模拟).为了覆盖每个路径,我可以选择编写与switch语句中的情况一样多的函数(对于各种InsuranceType
数据)或者我编写单个函数并通过更改InsuranceType
数据来重复相同的代码.测试代码以两种方式复制,第二种方式更容易出错,以验证对模拟对象的调用.我的问题是关于任何其他方式(即有助于避免重复的代码和干净的测试代码),怎么办经验的开发人员处理他们的单元测试switch语句(因为有在我的代码的情况下也有病例10秒)?代码是由其他一些开发人员编写的,我被要求编写单元测试以增加测试覆盖率并进行额外的单元测试.我需要知道是否存在关于多个逻辑分支的通用实践(不一定只有switch语句,但有时候有多个if - else if - else逻辑和3-4级深度嵌套条件).insurance.getInsuranceType()是一个枚举.请建议.
免责声明:这是一个意见,但我将其作为一个答案,因为评论不够长,无法完全解释自己.
通常,switch
语句表示代码设计不佳.在上面的例子中,例如:
public Coverage returnCoverage() { // I'm just making up a method name here switch (insurance.getInsuranceType()) { case None: { ... break; } case Health: { ... break; } ... } }
...看起来你有一些方法,其逻辑分支在保险类型上.这向我表明你的保险类型应该具有逻辑.例如:
public interface InsuranceType { // not enum Coverage getCoverage(); } public class NoInsurance implements InsuranceType { public Coverage getCoverage() { ... } } public class HealthInsurance implements InsuranceType { public Coverage getCoverage() { ... } } // etc.
然后,您的Insurance
对象将包含InsuranceType
与当前一样的实例.你可以用enum
s 做同样的事情- 按枚举值实现不同的方法 - 但它有点乱.
如果对所有switch
语句执行此操作,您应该看到一个连贯的InsuranceType
域对象开始出现,您应该开始看到可以移动到该类层次结构中的其他代码.此外,如果您需要在未来添加新类型的保险,你不必去通过所有代码搜索试图找到你打开的所有地方InsuranceType
-相反,你只需创建一个新的实现类和一切都神奇地起作用.
要回答有关测试的问题,如果您执行上述操作,那么您的switch
陈述就会消失.因此,您可以单独测试每个InsuranceType
s,而无需进行大量的模拟.
高度嵌套的if语句也是如此.将它们分解为单独的方法,并将逻辑移动到它所属的位置,并将其合并.您通常会发现很多剪切'n'粘贴代码,其中分支非常相似.如果使用IDE,请查找"提取方法"重构,并确保选择"检测重复项"选项.希望您可以减少必须维护的代码量,以及代码的复杂性,并让下一个开发人员保持更好的状态!
希望有所帮助!