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

Camunda相关服务单元测试求助:编写指定VariableInstance方法测试

编写Camunda变量查询方法的单元测试用例

嘿,作为单元测试新手,别慌,我会一步步带你搞定这个方法的单元测试~咱们的目标是只测试你写的getVariableInstance方法逻辑,不用启动真实的Camunda引擎,所以会用到Mockito来模拟依赖的Camunda服务类。

先明确测试思路

你的方法依赖ProcessEngine来获取RuntimeService,再通过查询链获取VariableInstance。我们要做的就是:

  • 模拟ProcessEngine、RuntimeService、VariableInstanceQuery这些对象,避免依赖真实Camunda引擎
  • 预设这些模拟对象的行为,让它们按照我们的预期返回结果
  • 调用目标方法,验证返回结果是否符合预期
  • (可选)验证依赖方法是否被正确调用,确保逻辑流程正确

准备依赖

首先确保你的项目里引入了这些测试依赖(以Maven为例):

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>4.11.0</version>
    <scope>test</scope>
</dependency>

完整测试代码

假设你的方法在CamundaVariableHelper这个类里(如果不是,替换成你实际的类名即可):

目标类(你的原代码)

public class CamundaVariableHelper {

    public VariableInstance getVariableInstance(String processInstanceId, ProcessEngine processEngine) {
        RuntimeService runtimeService = processEngine.getRuntimeService();
        return runtimeService.createVariableInstanceQuery()
                .processInstanceIdIn(processInstanceId)
                .variableName(BiConstant.ID)
                .singleResult();
    }
}

单元测试类

import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.variable.VariableInstance;
import org.camunda.bpm.engine.variable.VariableInstanceQuery;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
class CamundaVariableHelperTest {

    // 模拟Camunda核心服务对象
    @Mock
    private ProcessEngine mockProcessEngine;
    @Mock
    private RuntimeService mockRuntimeService;
    @Mock
    private VariableInstanceQuery mockVariableInstanceQuery;
    @Mock
    private VariableInstance mockVariableInstance;

    // 要测试的目标类实例
    private final CamundaVariableHelper helper = new CamundaVariableHelper();

    @Test
    void getVariableInstance_ShouldReturnVariable_WhenExists() {
        // 1. 预设模拟对象的行为
        // 当调用processEngine.getRuntimeService()时,返回我们的mockRuntimeService
        when(mockProcessEngine.getRuntimeService()).thenReturn(mockRuntimeService);
        // 当调用runtimeService.createVariableInstanceQuery()时,返回mock查询对象
        when(mockRuntimeService.createVariableInstanceQuery()).thenReturn(mockVariableInstanceQuery);
        // 链式调用的每个方法都要返回查询对象本身(因为是链式API)
        when(mockVariableInstanceQuery.processInstanceIdIn(anyString())).thenReturn(mockVariableInstanceQuery);
        when(mockVariableInstanceQuery.variableName(BiConstant.ID)).thenReturn(mockVariableInstanceQuery);
        // 最后调用singleResult()时,返回我们预设的mockVariableInstance
        when(mockVariableInstanceQuery.singleResult()).thenReturn(mockVariableInstance);

        // 2. 调用目标方法
        VariableInstance result = helper.getVariableInstance("test-process-id", mockProcessEngine);

        // 3. 断言结果符合预期
        assertNotNull(result);
        assertEquals(mockVariableInstance, result);

        // 4. 验证依赖方法是否被正确调用(可选,但能确保逻辑走对了)
        verify(mockProcessEngine).getRuntimeService();
        verify(mockRuntimeService).createVariableInstanceQuery();
        verify(mockVariableInstanceQuery).processInstanceIdIn("test-process-id");
        verify(mockVariableInstanceQuery).variableName(BiConstant.ID);
        verify(mockVariableInstanceQuery).singleResult();
    }

    @Test
    void getVariableInstance_ShouldReturnNull_WhenVariableNotFound() {
        // 预设行为和上面类似,但最后singleResult()返回null
        when(mockProcessEngine.getRuntimeService()).thenReturn(mockRuntimeService);
        when(mockRuntimeService.createVariableInstanceQuery()).thenReturn(mockVariableInstanceQuery);
        when(mockVariableInstanceQuery.processInstanceIdIn(anyString())).thenReturn(mockVariableInstanceQuery);
        when(mockVariableInstanceQuery.variableName(BiConstant.ID)).thenReturn(mockVariableInstanceQuery);
        when(mockVariableInstanceQuery.singleResult()).thenReturn(null);

        // 调用方法
        VariableInstance result = helper.getVariableInstance("non-existent-process-id", mockProcessEngine);

        // 断言返回null
        assertNull(result);
    }
}

代码解释

  • @ExtendWith(MockitoExtension.class):让JUnit 5和Mockito集成,自动创建和注入模拟对象
  • @Mock:标记需要Mockito创建的模拟对象,不用我们手动mock(XXX.class)
  • when(...).thenReturn(...):预设模拟对象的方法调用返回值,模拟真实Camunda服务的行为
  • verify(...):验证目标方法是否正确调用了依赖的方法,确保逻辑没有走偏
  • 两个测试用例覆盖了找到变量和找不到变量两种常见场景,保证方法的逻辑正确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:52:50