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

