如何为接收两个非基本类型参数、返回布尔值的Java方法编写JUnit测试
多分支布尔返回方法的JUnit测试用例编写方案
核心设计原则
- 每个独立分支对应一个单独的
@Test测试方法,不要把多个分支校验逻辑塞到同一个测试方法内,单方法单校验点的模式更便于后续问题定位 - 不需要为每个if条件单独写断言,只要你构造的测试数据仅命中目标分支,校验最终返回的布尔值符合预期即可证明该分支逻辑正确
- 测试数据优先手动构造实体对象,字段不多的话直接调用set方法赋值,PO类复杂可以借助Builder模式快速构造,尽量不要Mock整个入参实例,避免Mock逻辑和真实对象逻辑不一致导致测试失效
分支全覆盖实现步骤
你可以按方法的返回逻辑顺序,逐个分支构造测试用例:
1. 覆盖采购订单为空分支
触发逻辑:
currentversion.getPurchaseOrders().isEmpty() == true
构造规则:currentversion的purchaseOrders赋值为空集合,newversion所有字段赋值合法值即可,调用checkEligblity方法断言返回true
2. 覆盖基础字段不一致分支
这部分三个判断为或关系,需要写3个独立用例分别覆盖:
- 用例1:新旧实例
ReceiptNotice字段不一致,其余所有字段完全一致,purchaseOrders非空,断言返回true - 用例2:新旧实例
SizeType字段不一致,其余所有字段完全一致,purchaseOrders非空,断言返回true - 用例3:新旧实例
NumInPrices字段不一致,其余所有字段完全一致,purchaseOrders非空,断言返回true
3. 覆盖orderInfo不一致分支
前置条件:上述三个基础字段完全一致、purchaseOrders非空,三个子判断为或关系,分别构造用例:
- 用例1:
newversion的ReceiptNotice等于PASSED(即storeM = true),新旧实例orderInfo不一致,其余字段完全一致,断言返回true - 用例2:
storeM = false,currentversion的orderInfo以PASS开头,新旧实例orderInfo不一致,其余字段完全一致,断言返回true - 用例3:
storeM = false,newversion的orderInfo以PASS开头,新旧实例orderInfo不一致,其余字段完全一致,断言返回true
注意:你当前贴的
containsCustomerString方法存在笔误,入参定义为String ticketingInfo但逻辑里判断的是成员变量orderInfo,会导致逻辑不符合预期,建议先修正该问题再编写对应测试。
4. 覆盖采购订单遍历匹配分支
这部分需要覆盖匹配成功、匹配失败、storeM特殊校验等场景:
- 用例1:新旧实例的
purchaseOrders各有1条完全匹配的PO(所有字段都符合匹配条件、storeM = false时不需要校验inbound字段),遍历后两个集合都被清空,断言返回false - 用例2:新旧PO的基础匹配字段(
sku/skuId/Orgin/Target/ShippingDate)一致,但状态码、数量、vendorId等后续校验字段有一个不一致,遍历后集合不为空,断言返回true - 用例3:
storeM = true,PO的所有匹配字段都符合要求,唯独inbound字段新旧不一致,匹配失败集合有剩余,断言返回true - 用例4:新旧实例的PO数量不一致,遍历后有剩余PO,断言返回
true
优化技巧
- 可以用JUnit 5的
@ParameterizedTest参数化测试合并同类用例,比如基础字段不一致的3个用例,就可以通过参数传不同的字段差异标识,统一构造测试数据,减少重复代码 - 测试完成后可以用JaCoCo插件查看分支覆盖率,针对未覆盖到的分支补充对应用例即可
内容的提问来源于stack exchange,提问作者crcr
相关产品推荐
相关产品推荐

