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
相关产品推荐
相关产品推荐

