package com.ruoyi.system.service.impl; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.system.mapper.SysUserRoleMapper; import org.springframework.test.util.ReflectionTestUtils; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 中台用户本地映射回归测试。 */ public class SysUserServiceImplMiddlePlatformTest { public static void main(String[] args) { shouldReuseExistingLocalUser(); shouldCreateMissingLocalUserWithAdminRole(); shouldTreatAdminRoleAsAdministrator(); } private static void shouldReuseExistingLocalUser() { SysUser existingUser = new SysUser(); existingUser.setUserId(20L); existingUser.setUserName("middle-user"); UserMapperStub userMapperStub = new UserMapperStub(existingUser); UserRoleMapperStub roleMapperStub = new UserRoleMapperStub(); SysUserServiceImpl service = createService(userMapperStub, roleMapperStub); require(existingUser == service.getOrCreateMiddlePlatformAdmin("middle-user"), "已有本地用户未被复用"); require(userMapperStub.insertedUsers.isEmpty(), "已有本地用户被重复创建"); require(roleMapperStub.insertedRoles.isEmpty(), "已有本地用户的角色被覆盖"); } private static void shouldCreateMissingLocalUserWithAdminRole() { UserMapperStub userMapperStub = new UserMapperStub(null); UserRoleMapperStub roleMapperStub = new UserRoleMapperStub(); SysUserServiceImpl service = createService(userMapperStub, roleMapperStub); SysUser createdUser = service.getOrCreateMiddlePlatformAdmin("middle-user"); require(createdUser != null && Long.valueOf(21L).equals(createdUser.getUserId()), "未返回自动创建的本地用户"); require(userMapperStub.insertedUsers.size() == 1, "本地用户创建次数不正确"); SysUser insertedUser = userMapperStub.insertedUsers.get(0); require("middle-user".equals(insertedUser.getUserName()), "本地用户名不正确"); require("middle-user".equals(insertedUser.getNickName()), "本地昵称不正确"); require("0".equals(insertedUser.getStatus()), "本地用户状态不正确"); require(insertedUser.getPassword() != null, "未生成随机本地密码"); require(roleMapperStub.insertedRoles.size() == 1, "管理员角色绑定次数不正确"); SysUserRole role = roleMapperStub.insertedRoles.get(0); require(Long.valueOf(21L).equals(role.getUserId()), "角色绑定的用户不正确"); require(Long.valueOf(1L).equals(role.getRoleId()), "未绑定管理员角色"); } private static void shouldTreatAdminRoleAsAdministrator() { SysRole adminRole = new SysRole(); adminRole.setRoleId(1L); SysUser user = new SysUser(); user.setUserId(21L); user.setRoles(Arrays.asList(adminRole)); require(user.isAdmin(), "管理员角色未获得管理员权限"); } private static SysUserServiceImpl createService(UserMapperStub userMapperStub, UserRoleMapperStub roleMapperStub) { SysUserServiceImpl service = new SysUserServiceImpl(); ReflectionTestUtils.setField(service, "userMapper", proxy(SysUserMapper.class, userMapperStub)); ReflectionTestUtils.setField(service, "userRoleMapper", proxy(SysUserRoleMapper.class, roleMapperStub)); return service; } @SuppressWarnings("unchecked") private static T proxy(Class type, MapperStub stub) { return (T) Proxy.newProxyInstance(type.getClassLoader(), new Class[] { type }, (proxy, method, args) -> stub.invoke(method.getName(), args)); } private static void require(boolean condition, String message) { if (!condition) { throw new AssertionError(message); } } private interface MapperStub { Object invoke(String methodName, Object[] args); } private static final class UserMapperStub implements MapperStub { private SysUser storedUser; private final List insertedUsers = new ArrayList(); private UserMapperStub(SysUser storedUser) { this.storedUser = storedUser; } @Override public Object invoke(String methodName, Object[] args) { if ("selectUserByUserName".equals(methodName)) { return storedUser; } if ("insertUser".equals(methodName)) { SysUser user = (SysUser) args[0]; user.setUserId(21L); insertedUsers.add(user); storedUser = user; return 1; } return null; } } private static final class UserRoleMapperStub implements MapperStub { private final List insertedRoles = new ArrayList(); @Override public Object invoke(String methodName, Object[] args) { if ("insertUserRole".equals(methodName)) { insertedRoles.add((SysUserRole) args[0]); return 1; } return null; } } }