如何为含if条件判断的void方法编写单元测试用例
Java void方法全分支单元测试实现方案
针对setRefundIdForPrepaid方法的if判断逻辑,共需覆盖2个核心分支,以下是可直接落地的测试实现。
待覆盖分支清单
- 分支1:入参
RefundReturnRequest内嵌的RefundRequest对象refundId字段为空白(null、空字符串、全空白字符)时,自动生成取值在0~999999999区间的随机整数字符串赋值给该字段 - 分支2:入参内嵌
RefundRequest的refundId字段为非空白值时,不对字段做任何修改
测试用例实现
测试基于JUnit 5编写,通过参数化测试覆盖所有空白场景,无需额外引入复杂Mock逻辑:
import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.*; class PrepaidRefundServiceTest { // 初始化被测类实例,需根据实际业务类名替换 private final PrepaidRefundService refundService = new PrepaidRefundService(); /** * 覆盖refundId为空白的分支场景 * 覆盖输入包含:null、空字符串、全空格、制表符、换行符等所有StringUtils.isBlank判定为空白的场景 */ @ParameterizedTest @NullAndEmptySource @ValueSource(strings = {" ", "\t", "\n"}) void setRefundIdForPrepaid_WhenRefundIdBlank_ShouldGenerateValidRandomId(String blankInput) { // 构造测试入参 RefundReturnRequest request = new RefundReturnRequest(); RefundRequest innerRequest = new RefundRequest(); innerRequest.setRefundId(blankInput); request.setRefundRequest(innerRequest); // 执行被测方法 refundService.setRefundIdForPrepaid(request); // 结果校验 String generatedId = request.getRefundRequest().getRefundId(); // 校验生成的ID非空白 assertFalse(StringUtils.isBlank(generatedId)); // 校验生成的ID为合法整数 int idValue = Integer.parseInt(generatedId); // 校验ID取值范围符合[0, 999999999)的规则 assertTrue(idValue >= 0 && idValue < 999999999); } /** * 覆盖refundId已有非空白值的分支场景 * 验证原有值不会被修改 */ @Test void setRefundIdForPrepaid_WhenRefundIdExists_ShouldKeepOriginalValue() { // 构造测试入参,预设非空退款ID String originalRefundId = "PRE_REFUND_2024050001"; RefundReturnRequest request = new RefundReturnRequest(); RefundRequest innerRequest = new RefundRequest(); innerRequest.setRefundId(originalRefundId); request.setRefundRequest(innerRequest); // 执行被测方法 refundService.setRefundIdForPrepaid(request); // 校验原有ID未被篡改 assertEquals(originalRefundId, request.getRefundRequest().getRefundId()); } }
测试说明
- 无需硬编码Mock
ThreadLocalRandom的返回值,只校验生成结果的格式、取值范围符合规则即可,避免测试代码和业务实现过度耦合 - 参数化测试一次性覆盖所有
StringUtils.isBlank判定为true的边界输入,避免遗漏空白场景 - 两个测试用例执行完即可实现if逻辑100%分支覆盖
内容的提问来源于stack exchange,提问作者umang garg
相关产品推荐
相关产品推荐

