package com.iailab.module.bpm.framework.flowable.core.candidate.expression; import com.iailab.framework.test.core.ut.BaseMockitoUnitTest; import com.iailab.module.bpm.service.task.BpmProcessInstanceService; import com.iailab.module.system.api.dept.DeptApi; import com.iailab.module.system.api.dept.dto.DeptRespDTO; import com.iailab.module.system.api.user.AdminUserApi; import com.iailab.module.system.api.user.dto.AdminUserRespDTO; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import java.util.Set; import static com.iailab.framework.common.pojo.CommonResult.success; import static com.iailab.framework.common.util.collection.SetUtils.asSet; import static com.iailab.framework.test.core.util.RandomUtils.randomPojo; import static com.iailab.framework.test.core.util.RandomUtils.randomString; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; public class BpmTaskAssignLeaderExpressionTest extends BaseMockitoUnitTest { @InjectMocks private BpmTaskAssignLeaderExpression expression; @Mock private AdminUserApi adminUserApi; @Mock private DeptApi deptApi; @Mock private BpmProcessInstanceService processInstanceService; @Test public void testCalculateUsers_noDept() { // 准备参数 DelegateExecution execution = mockDelegateExecution(1L); // mock 方法(startUser) AdminUserRespDTO startUser = randomPojo(AdminUserRespDTO.class, o -> o.setDeptId(10L)); when(adminUserApi.getUser(eq(1L))).thenReturn(success(startUser)); // mock 方法(getStartUserDept)没有部门 when(deptApi.getDept(eq(10L))).thenReturn(success(null)); // 调用 Set result = expression.calculateUsers(execution, 1); // 断言 assertEquals(0, result.size()); } @Test public void testCalculateUsers_noParentDept() { // 准备参数 DelegateExecution execution = mockDelegateExecution(1L); // mock 方法(startUser) AdminUserRespDTO startUser = randomPojo(AdminUserRespDTO.class, o -> o.setDeptId(10L)); when(adminUserApi.getUser(eq(1L))).thenReturn(success(startUser)); DeptRespDTO startUserDept = randomPojo(DeptRespDTO.class, o -> o.setId(10L).setParentId(100L) .setLeaderUserId(20L)); // mock 方法(getDept) when(deptApi.getDept(eq(10L))).thenReturn(success(startUserDept)); when(deptApi.getDept(eq(100L))).thenReturn(success(null)); // 调用 Set result = expression.calculateUsers(execution, 2); // 断言 assertEquals(asSet(20L), result); } @Test public void testCalculateUsers_existParentDept() { // 准备参数 DelegateExecution execution = mockDelegateExecution(1L); // mock 方法(startUser) AdminUserRespDTO startUser = randomPojo(AdminUserRespDTO.class, o -> o.setDeptId(10L)); when(adminUserApi.getUser(eq(1L))).thenReturn(success(startUser)); DeptRespDTO startUserDept = randomPojo(DeptRespDTO.class, o -> o.setId(10L).setParentId(100L) .setLeaderUserId(20L)); when(deptApi.getDept(eq(10L))).thenReturn(success(startUserDept)); // mock 方法(父 dept) DeptRespDTO parentDept = randomPojo(DeptRespDTO.class, o -> o.setId(100L).setParentId(1000L) .setLeaderUserId(200L)); when(deptApi.getDept(eq(100L))).thenReturn(success(parentDept)); // 调用 Set result = expression.calculateUsers(execution, 2); // 断言 assertEquals(asSet(200L), result); } @SuppressWarnings("SameParameterValue") private DelegateExecution mockDelegateExecution(Long startUserId) { ExecutionEntityImpl execution = new ExecutionEntityImpl(); execution.setProcessInstanceId(randomString()); // mock 返回 startUserId ExecutionEntityImpl processInstance = new ExecutionEntityImpl(); processInstance.setStartUserId(String.valueOf(startUserId)); when(processInstanceService.getProcessInstance(eq(execution.getProcessInstanceId()))) .thenReturn(processInstance); return execution; } }