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

如何在Mockito测试中为逻辑表达式中的变量设置值

测试逻辑表达式计算的Mockito方案

既然你是第一次用Mockito,咱们一步步来解决这个问题。核心思路是:mock那些提供ID对应值的依赖组件,让它返回你预设的布尔值,这样Runner在计算逻辑表达式时就能用到这些值了。

步骤1:准备Mockito的基础设置

首先,你需要在测试类里声明并初始化mock对象。假设applicationCacheHandler是负责提供那些ID对应值的组件(从Runner的构造参数来看,这个可能性最大),我们先mock它和另一个依赖applicationEventPublisher:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;

class RunnerTest {
    @Mock
    private ApplicationEventPublisher applicationEventPublisher; // mock事件发布器
    @Mock
    private ApplicationCacheHandler applicationCacheHandler; // mock提供ID值的组件

    private Runner underTest;

    @BeforeEach
    void setUp() {
        // 初始化所有mock对象
        MockitoAnnotations.openMocks(this);
    }

步骤2:为表达式中的ID预设返回值

在测试方法里,你需要告诉Mockito:当调用applicationCacheHandler的某个方法(比如getValueById,你得换成你实际项目里的方法名)获取指定ID的值时,返回你想要的布尔值。然后再初始化Runner并执行测试:

@Test
    public void testAggregationExpressionEvaluation() {
        // 1. 构建测试用的Item和Aggregation
        Item item = new Item();
        item.setUid("fc_uf_wzdf_0018");
        item.setDeviceName("test");
        item.setDeviceId("devID");
        // 注意:你原来的表达式多了一个右括号,这里修正了
        Aggregation aggregation = new Aggregation("1", "(fc_uf_wzdf_0021 && fc_uf_wzdf_0025)||fc_uf_wzdf_0027");
        List<Aggregation> aggregationList = new ArrayList<>();
        aggregationList.add(aggregation);
        item.setAggregation(aggregationList);

        // 2. 为每个ID预设布尔值,这里可以根据测试场景调整
        when(applicationCacheHandler.getValueById("fc_uf_wzdf_0021")).thenReturn(true);
        when(applicationCacheHandler.getValueById("fc_uf_wzdf_0025")).thenReturn(false);
        when(applicationCacheHandler.getValueById("fc_uf_wzdf_0027")).thenReturn(true);

        // 3. 初始化待测试的Runner实例,传入mock的依赖和构建好的Item
        underTest = new Runner(applicationEventPublisher, applicationCacheHandler, item);

        // 4. 执行测试方法
        underTest.run();

        // 5. 验证逻辑(根据你的业务需求来)
        // 比如,如果表达式计算结果为true时会发布某个事件,你可以这样验证:
        // verify(applicationEventPublisher).publishEvent(any(YourCustomEvent.class));
        // 或者如果Runner会更新Item的某个状态,你可以断言这个状态值
    }
}

额外提示

  • 如果你的Runner不是通过applicationCacheHandler获取ID值,而是通过其他组件,只需要把mock的对象换成那个组件即可,核心逻辑是一样的:让依赖返回你预设的测试数据。
  • 多写几个测试用例,覆盖不同的布尔组合:比如fc_uf_wzdf_0021和fc_uf_wzdf_0025都为true,或者fc_uf_wzdf_0027为false,验证表达式的计算结果是否符合预期。
  • 确保你的逻辑表达式没有语法错误(比如你原来的多了一个)),否则测试时可能会抛出解析异常。

内容的提问来源于stack exchange,提问作者Rakshan Premsagar Kapikad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 03:07:31