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

Junit中如何验证三目运算符分支调用方法的入参值?

解决方案

你需要配合Mockito测试框架完成方法调用入参的校验,这是Java单元测试中校验依赖方法调用行为的通用方案,具体操作步骤如下:

1. 引入依赖

确保你的项目中已经引入JUnit和Mockito相关依赖,SpringBoot项目默认的spring-boot-starter-test起步依赖已经内置了这两个组件,不需要额外引入。

2. 编写测试用例

根据tableInsert方法所属的类不同,写法分为两种场景:

场景1:tableInsert是当前被测类的自有方法

使用Mockito的Spy做部分模拟即可,示例代码如下:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.List;

// 被测类示例
class ColumnHandler {
    public List<String> transformColumns(String action){
        return action.equals("delete")?
                tableInsert("onetwo", false)
                :tableInsert("onetwothree", true);
    }
    // 自有方法tableInsert
    public List<String> tableInsert(String column, boolean flag) {
        // 原有业务逻辑
        return new ArrayList<>();
    }
}

// 测试类
@RunWith(MockitoJUnitRunner.class)
public class ColumnHandlerTest {
    // Spy表示部分模拟,未指定Mock逻辑的方法会执行真实代码
    @Spy
    private ColumnHandler columnHandler;

    @Test
    public void testTransformColumnsWhenActionIsDelete() {
        // 调用被测方法
        columnHandler.transformColumns("delete");
        // 校验tableInsert是否以预期的入参被调用1次
        verify(columnHandler).tableInsert("onetwo", false);
    }
}

场景2:tableInsert是其他依赖类的方法

如果tableInsert属于其他注入到被测类的依赖(比如DAO层类),用Mock模拟依赖类即可,示例代码如下:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.List;

// tableInsert所属的依赖类示例
class TableDao {
    public List<String> tableInsert(String column, boolean flag) {
        // 原有业务逻辑
        return new ArrayList<>();
    }
}

// 被测类
class ColumnHandler {
    // 依赖注入TableDao
    private TableDao tableDao;
    public ColumnHandler(TableDao tableDao) {
        this.tableDao = tableDao;
    }

    public List<String> transformColumns(String action){
        return action.equals("delete")?
                tableDao.tableInsert("onetwo", false)
                :tableDao.tableInsert("onetwothree", true);
    }
}

// 测试类
@RunWith(MockitoJUnitRunner.class)
public class ColumnHandlerTest {
    // Mock依赖类实例
    @Mock
    private TableDao tableDao;
    // 自动将Mock的依赖注入到被测类实例
    @InjectMocks
    private ColumnHandler columnHandler;

    @Test
    public void testTransformColumnsWhenActionIsDelete() {
        columnHandler.transformColumns("delete");
        // 校验依赖方法的入参符合预期
        verify(tableDao).tableInsert("onetwo", false);
    }
}

补充说明

如果需要灵活匹配参数,可以使用Mockito内置的参数匹配器,比如用eq("onetwo")匹配指定字符串、anyBoolean()匹配任意布尔值、anyString()匹配任意字符串,按需组合即可。如果需要校验调用次数,可以在verify方法中传入次数参数,比如verify(tableDao, times(1)).tableInsert(...)确保方法只被调用了1次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:09:02