You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含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());
    }
}

测试说明

  • 无需硬编码MockThreadLocalRandom的返回值,只校验生成结果的格式、取值范围符合规则即可,避免测试代码和业务实现过度耦合
  • 参数化测试一次性覆盖所有StringUtils.isBlank判定为true的边界输入,避免遗漏空白场景
  • 两个测试用例执行完即可实现if逻辑100%分支覆盖

内容的提问来源于stack exchange,提问作者umang garg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:51:27