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

