Browse Source

单元测试

huangxiao 1 month ago
parent
commit
bca40054de

+ 24 - 12
pom.xml

@@ -14,6 +14,7 @@
         <hosea-cloud.version>1.0.0</hosea-cloud.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
+        <maven-surefire-plugin.version>3.5.3</maven-surefire-plugin.version>
         <spring-boot.version>3.0.2</spring-boot.version>
         <mysql.version>8.0.32</mysql.version>
     </properties>
@@ -36,18 +37,6 @@
             <type>pom</type>
         </dependency>
         <!--endregion-->
-        <!--region 单元测试-->
-        <dependency>
-            <groupId>org.junit.jupiter</groupId>
-            <artifactId>junit-jupiter</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <!--endregion-->
     </dependencies>
 
     <dependencyManagement>
@@ -165,13 +154,36 @@
                     </executions>
                 </plugin>
                 <!--endregion-->
+                <!--region 让Maven test能正常执行-->
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>${maven-surefire-plugin.version}</version>
+                    <configuration>
+                        <includes>
+                            <!--只需执行这一个类,由于Junit只能做到方法的顺序执行,不能做类的顺序执行,所以这个类做了手动排序-->
+                            <include>**/AllTest.java</include>
+                        </includes>
+                        <forkCount>1</forkCount>
+                        <reuseForks>false</reuseForks>
+                    </configuration>
+                </plugin>
+                <!--endregion-->
             </plugins>
         </pluginManagement>
         <plugins>
+            <!--region 动态版本号-->
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>flatten-maven-plugin</artifactId>
             </plugin>
+            <!--endregion-->
+            <!--region 让Maven test能正常执行-->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+            </plugin>
+            <!--endregion-->
         </plugins>
     </build>
 

+ 2 - 7
start/pom.xml

@@ -25,13 +25,8 @@
             <artifactId>cloud-nacos</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.xerial</groupId>
-            <artifactId>sqlite-jdbc</artifactId>
+            <groupId>com.hosea.cloud</groupId>
+            <artifactId>cloud-test</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>

+ 0 - 83
start/src/test/java/com/hosea/service/user/client/api/TenantApiTest.java

@@ -1,83 +0,0 @@
-package com.hosea.service.user.client.api;
-
-import cn.hutool.core.util.RandomUtil;
-import com.hosea.service.user.client.dto.data.TenantDTO;
-import com.hosea.service.user.client.dto.data.TenantUniqueDTO;
-import com.hosea.service.user.client.dto.request.TenantAddCmd;
-import com.hosea.service.user.client.dto.request.TenantListPageQuery;
-import com.hosea.service.user.client.dto.request.TenantUpdateCmd;
-import jakarta.annotation.Resource;
-import org.junit.jupiter.api.*;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@Order(1)
-@SpringBootTest
-@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
-class TenantApiTest {
-    public static final int TEST_NUM = 10;
-    @Resource
-    private TenantApi api;
-
-    @Order(1)
-    @RepeatedTest(value = TEST_NUM, name = "第{currentRepetition}次增加")
-    void add(RepetitionInfo info) {
-        TenantDTO dto = TenantDTO.builder()
-                .code("code" + info.getCurrentRepetition())
-                .name(RandomUtil.randomString(5))
-                .build();
-        TenantAddCmd cmd = TenantAddCmd.builder().tenant(dto).build();
-        Assertions.assertTrue(api.add(cmd).isSuccess());
-        Assertions.assertFalse(api.add(cmd).isSuccess());
-        Assertions.assertFalse(api.add(new TenantAddCmd()).isSuccess());
-        dto.setCode("");
-        Assertions.assertFalse(api.add(cmd).isSuccess());
-        Assertions.assertFalse(api.add(null).isSuccess());
-    }
-
-    @Test
-    @Order(2)
-    void get() {
-        Assertions.assertNotNull(api.get(TenantUniqueDTO.builder().code("code5").build()).getData().getName());
-        Assertions.assertFalse(api.add(null).isSuccess());
-        Assertions.assertFalse(api.get(new TenantUniqueDTO()).isSuccess());
-        Assertions.assertFalse(api.get(TenantUniqueDTO.builder().code("xxxx").build()).isSuccess());
-    }
-
-    @Order(3)
-    @RepeatedTest(value = TEST_NUM, name = "第{currentRepetition}次修改")
-    void update(RepetitionInfo info) {
-        int index = info.getCurrentRepetition();
-        TenantDTO dto = TenantDTO.builder()
-                .code("code" + index)
-                .name("name" + index)
-                .build();
-        Assertions.assertTrue(api.update(new TenantUpdateCmd(dto)).isSuccess());
-        Assertions.assertFalse(api.update(null).isSuccess());
-        Assertions.assertFalse(api.update(new TenantUpdateCmd()).isSuccess());
-        dto.setCode("");
-        Assertions.assertFalse(api.update(new TenantUpdateCmd(dto)).isSuccess());
-        dto.setCode("xxxx");
-        Assertions.assertFalse(api.update(new TenantUpdateCmd(dto)).isSuccess());
-    }
-
-    @Test
-    @Order(10)
-    void list() {
-        Integer size = 2;
-        TenantListPageQuery query = new TenantListPageQuery();
-        query.setPageIndex(3);
-        query.setPageSize(size);
-        query.setName("n");
-        query.setCode("c");
-        query.setOrderBy("GROUPCODE");
-        Assertions.assertEquals(api.list(query).getData().size(), size);
-        Assertions.assertEquals(api.list(null).getTotalCount(), TEST_NUM);
-        Assertions.assertEquals(api.list(new TenantListPageQuery()).getTotalCount(), TEST_NUM);
-        query.setName("");
-        query.setCode("");
-        Assertions.assertEquals(api.list(query).getTotalCount(), TEST_NUM);
-        query.setName("xxx");
-        query.setCode("xxx");
-        Assertions.assertEquals(api.list(query).getTotalCount(), 0);
-    }
-}

+ 0 - 117
start/src/test/java/com/hosea/service/user/client/api/UserApiTest.java

@@ -1,117 +0,0 @@
-package com.hosea.service.user.client.api;
-
-import cn.hutool.core.util.RandomUtil;
-import com.hosea.cloud.web.login.JwtToken;
-import com.hosea.cloud.webmvc.JwtTokenUtil;
-import com.hosea.service.user.client.dto.data.TenantUniqueDTO;
-import com.hosea.service.user.client.dto.data.UserDTO;
-import com.hosea.service.user.client.dto.data.UserUniqueDTO;
-import com.hosea.service.user.client.dto.request.UserAddCmd;
-import com.hosea.service.user.client.dto.request.UserJoinTenantCmd;
-import com.hosea.service.user.client.dto.request.UserListByTenantPageQuery;
-import com.hosea.service.user.client.dto.request.UserUpdateCmd;
-import jakarta.annotation.Resource;
-import org.junit.jupiter.api.*;
-import org.mockito.MockedStatic;
-import org.mockito.Mockito;
-import org.springframework.boot.test.context.SpringBootTest;
-
-import java.util.List;
-import java.util.stream.IntStream;
-
-@Order(1)
-@SpringBootTest
-@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
-class UserApiTest {
-    @Resource
-    private UserApi api;
-
-    @Order(1)
-    @RepeatedTest(value = TenantApiTest.TEST_NUM, name = "第{currentRepetition}次增加")
-    void add(RepetitionInfo info) {
-        UserDTO dto = UserDTO.builder()
-                .name("user" + info.getCurrentRepetition())
-                .nickName(RandomUtil.randomString(5))
-                .build();
-        Assertions.assertTrue(api.add(new UserAddCmd(dto)).isSuccess());
-        Assertions.assertFalse(api.add(null).isSuccess());
-        Assertions.assertFalse(api.add(new UserAddCmd()).isSuccess());
-        dto.setName("");
-        Assertions.assertFalse(api.add(new UserAddCmd(dto)).isSuccess());
-    }
-
-    @Order(2)
-    @RepeatedTest(value = TenantApiTest.TEST_NUM, name = "第{currentRepetition}次修改")
-    void update(RepetitionInfo info) {
-        int index = info.getCurrentRepetition();
-        UserDTO dto = UserDTO.builder()
-                .name("user" + index)
-                .nickName("name" + index)
-                .build();
-        Assertions.assertTrue(api.update(new UserUpdateCmd(dto)).isSuccess());
-        Assertions.assertFalse(api.update(null).isSuccess());
-        Assertions.assertFalse(api.update(new UserUpdateCmd()).isSuccess());
-        dto.setName("");
-        Assertions.assertFalse(api.update(new UserUpdateCmd(dto)).isSuccess());
-        dto.setName("xxxx");
-        Assertions.assertFalse(api.update(new UserUpdateCmd(dto)).isSuccess());
-    }
-
-    @Order(3)
-    @Test
-    void join() {
-        UserUniqueDTO user = new UserUniqueDTO(null, "user1");
-        List<TenantUniqueDTO> tenant = List.of(new TenantUniqueDTO(null, "code1"));
-        Assertions.assertTrue(api.join(new UserJoinTenantCmd(user, tenant)).isSuccess());
-        Assertions.assertFalse(api.join(null).isSuccess());
-        Assertions.assertFalse(api.join(new UserJoinTenantCmd()).isSuccess());
-        Assertions.assertFalse(api.join(new UserJoinTenantCmd(user, null)).isSuccess());
-        Assertions.assertFalse(api.join(new UserJoinTenantCmd(null, tenant)).isSuccess());
-        Assertions.assertFalse(api.join(new UserJoinTenantCmd(new UserUniqueDTO(null, ""), tenant)).isSuccess());
-        Assertions.assertFalse(api.join(new UserJoinTenantCmd(new UserUniqueDTO(null, "xxxx"), tenant)).isSuccess());
-        Assertions.assertFalse(api.join(new UserJoinTenantCmd(user, List.of(new TenantUniqueDTO(null, "")))).isSuccess());
-        // 加入不存在的租户不会报错,但是加不进去
-        Assertions.assertTrue(api.join(new UserJoinTenantCmd(user, List.of(new TenantUniqueDTO(null, "xxxx")))).isSuccess());
-    }
-
-    @Order(4)
-    @RepeatedTest(value = TenantApiTest.TEST_NUM, name = "第{currentRepetition}次加入")
-    void joinAll(RepetitionInfo info) {
-        List<TenantUniqueDTO> tenants = IntStream.range(1, TenantApiTest.TEST_NUM)
-                .mapToObj(i -> new TenantUniqueDTO(null, "code" + i))
-                .toList();
-        UserUniqueDTO user = new UserUniqueDTO(null, "user" + info.getCurrentRepetition());
-        Assertions.assertTrue(api.join(new UserJoinTenantCmd(user, tenants)).isSuccess());
-    }
-
-    @Test
-    @Order(5)
-    void get() {
-        Assertions.assertFalse(api.get().isSuccess());
-        try (MockedStatic<JwtTokenUtil> jwt = Mockito.mockStatic(JwtTokenUtil.class)) {
-            jwt.when(JwtTokenUtil::getTokenOrElseThrow).thenReturn(JwtToken.builder().user("user5").build());
-            Assertions.assertTrue(api.get().isSuccess());
-            jwt.when(JwtTokenUtil::getTokenOrElseThrow).thenReturn(new JwtToken());
-            Assertions.assertFalse(api.get().isSuccess());
-            jwt.when(JwtTokenUtil::getTokenOrElseThrow).thenReturn(JwtToken.builder().user("xxx").build());
-            Assertions.assertFalse(api.get().isSuccess());
-        }
-    }
-
-    @Test
-    @Order(10)
-    void list() {
-        Integer size = 2;
-        UserListByTenantPageQuery query = new UserListByTenantPageQuery();
-        query.setPageIndex(3);
-        query.setPageSize(size);
-        query.setTenant(new TenantUniqueDTO(null, "code1"));
-        query.setOrderBy("GROUPCODE");
-        Assertions.assertEquals(api.list(query).getData().size(), size);
-        Assertions.assertFalse(api.list(null).isSuccess());
-        Assertions.assertFalse(api.list(new UserListByTenantPageQuery()).isSuccess());
-        Assertions.assertFalse(api.list(new UserListByTenantPageQuery(new TenantUniqueDTO(null, ""))).isSuccess());
-        Assertions.assertEquals(api.list(new UserListByTenantPageQuery(new TenantUniqueDTO(null, "code1"))).getTotalCount(), TenantApiTest.TEST_NUM);
-        Assertions.assertEquals(api.list(new UserListByTenantPageQuery(new TenantUniqueDTO(null, "xxx"))).getTotalCount(), 0);
-    }
-}

+ 17 - 0
start/src/test/java/com/hosea/service/user/test/AllTest.java

@@ -0,0 +1,17 @@
+package com.hosea.service.user.test;
+
+import com.hosea.cloud.test.JunitSequentialExecutionTest;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Junit顺序执行
+ *
+ * @author hosea
+ * @date 2025-08-07
+ */
+public class AllTest extends JunitSequentialExecutionTest {
+    @Test
+    public void run() {
+        super.run();
+    }
+}

+ 94 - 0
start/src/test/java/com/hosea/service/user/test/client/TenantApiTest.java

@@ -0,0 +1,94 @@
+package com.hosea.service.user.test.client;
+
+import cn.hutool.core.util.RandomUtil;
+import com.hosea.cloud.test.Assertions;
+import com.hosea.cloud.test.Tuple;
+import com.hosea.service.user.client.api.TenantApi;
+import com.hosea.service.user.client.dto.constant.TenantErrorCode;
+import com.hosea.service.user.client.dto.data.TenantDTO;
+import com.hosea.service.user.client.dto.data.TenantUniqueDTO;
+import com.hosea.service.user.client.dto.request.TenantAddCmd;
+import com.hosea.service.user.client.dto.request.TenantListPageQuery;
+import com.hosea.service.user.client.dto.request.TenantUpdateCmd;
+import jakarta.annotation.Resource;
+import org.junit.jupiter.api.*;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@Order(1)
+@SpringBootTest
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class TenantApiTest {
+    public static final int TEST_NUM = 10;
+    @Resource
+    private TenantApi api;
+
+    @Order(1)
+    @RepeatedTest(value = TEST_NUM, name = "第{currentRepetition}次增加")
+    public void add(RepetitionInfo info) {
+        TenantAddCmd cmd = new TenantAddCmd(createTenant("code" + info.getCurrentRepetition(), RandomUtil.randomString(5)));
+        Assertions.success(api::add, cmd);
+        Assertions.error(api::add
+                , Tuple.of(null, TenantErrorCode.NOT_NULL)
+                , Tuple.of(cmd, TenantErrorCode.ALREADY_EXISTS)
+                , Tuple.of(new TenantAddCmd(), TenantErrorCode.NOT_NULL)
+                , Tuple.of(new TenantAddCmd(createTenant("")), TenantErrorCode.NOT_NULL_CODE)
+        );
+    }
+
+    @Test
+    @Order(2)
+    public void get() {
+        Assertions.assertNotNull(api.get(createTenant("code5")).getData().getName());
+        Assertions.error(api::get
+                , Tuple.of(null, TenantErrorCode.NOT_NULL)
+                , Tuple.of(new TenantUniqueDTO(), TenantErrorCode.NOT_NULL_ID_OR_CODE)
+                , Tuple.of(createTenant("xxx"), TenantErrorCode.NOT_EXIST)
+        );
+    }
+
+    @Order(3)
+    @RepeatedTest(value = TEST_NUM, name = "第{currentRepetition}次修改")
+    public void update(RepetitionInfo info) {
+        int index = info.getCurrentRepetition();
+        TenantUpdateCmd cmd = new TenantUpdateCmd(createTenant("code" + index, "name" + index));
+        Assertions.success(api::update, cmd);
+        Assertions.error(api::update
+                , Tuple.of(null, TenantErrorCode.NOT_NULL)
+                , Tuple.of(new TenantUpdateCmd(), TenantErrorCode.NOT_NULL)
+                , Tuple.of(new TenantUpdateCmd(createTenant("")), TenantErrorCode.NOT_NULL_ID_OR_CODE)
+                , Tuple.of(new TenantUpdateCmd(createTenant("xxxx")), TenantErrorCode.NOT_EXIST)
+        );
+    }
+
+    @Test
+    @Order(10)
+    public void list() {
+        Integer size = 2;
+        TenantListPageQuery query = new TenantListPageQuery();
+        query.setPageIndex(3);
+        query.setPageSize(size);
+        query.setName("n");
+        query.setCode("c");
+        query.setOrderBy("GROUPCODE");
+        Assertions.assertEquals(api.list(query).getData().size(), size);
+        Assertions.assertEquals(api.list(null).getTotalCount(), TEST_NUM);
+        Assertions.assertEquals(api.list(new TenantListPageQuery()).getTotalCount(), TEST_NUM);
+        query.setName("");
+        query.setCode("");
+        Assertions.assertEquals(api.list(query).getTotalCount(), TEST_NUM);
+        query.setName("xxx");
+        query.setCode("xxx");
+        Assertions.assertEquals(api.list(query).getTotalCount(), 0);
+    }
+
+    private static TenantDTO createTenant(String code) {
+        return createTenant(code, null);
+    }
+
+    private static TenantDTO createTenant(String code, String name) {
+        return TenantDTO.builder()
+                .code(code)
+                .name(name)
+                .build();
+    }
+}

+ 2 - 2
start/src/test/java/com/hosea/service/user/client/api/TestEndClean.java → start/src/test/java/com/hosea/service/user/test/client/TestEndClean.java

@@ -1,4 +1,4 @@
-package com.hosea.service.user.client.api;
+package com.hosea.service.user.test.client;
 
 import cn.hutool.db.Db;
 import com.alibaba.druid.DbType;
@@ -41,7 +41,7 @@ public class TestEndClean {
 
     @Test
     @SneakyThrows
-    void clean() {
+    public void clean() {
         if (!db) {
             return;
         }

+ 134 - 0
start/src/test/java/com/hosea/service/user/test/client/UserApiTest.java

@@ -0,0 +1,134 @@
+package com.hosea.service.user.test.client;
+
+import cn.hutool.core.util.RandomUtil;
+import com.hosea.cloud.test.Assertions;
+import com.hosea.cloud.test.Tuple;
+import com.hosea.cloud.web.login.JwtToken;
+import com.hosea.cloud.webmvc.JwtTokenUtil;
+import com.hosea.cloud.webmvc.constant.LoginErrorCode;
+import com.hosea.service.user.client.api.UserApi;
+import com.hosea.service.user.client.dto.constant.TenantErrorCode;
+import com.hosea.service.user.client.dto.constant.UserErrorCode;
+import com.hosea.service.user.client.dto.data.TenantUniqueDTO;
+import com.hosea.service.user.client.dto.data.UserDTO;
+import com.hosea.service.user.client.dto.data.UserUniqueDTO;
+import com.hosea.service.user.client.dto.request.UserAddCmd;
+import com.hosea.service.user.client.dto.request.UserJoinTenantCmd;
+import com.hosea.service.user.client.dto.request.UserListByTenantPageQuery;
+import com.hosea.service.user.client.dto.request.UserUpdateCmd;
+import jakarta.annotation.Resource;
+import org.junit.jupiter.api.*;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.List;
+import java.util.stream.IntStream;
+
+@Order(2)
+@SpringBootTest
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class UserApiTest {
+    @Resource
+    private UserApi api;
+
+    @Order(1)
+    @RepeatedTest(value = TenantApiTest.TEST_NUM, name = "第{currentRepetition}次增加")
+    public void add(RepetitionInfo info) {
+        UserAddCmd cmd = new UserAddCmd(createUser("user" + info.getCurrentRepetition(), RandomUtil.randomString(5)));
+        Assertions.success(api::add, cmd);
+        Assertions.error(api::add
+                , Tuple.of(null, UserErrorCode.NOT_NULL)
+                , Tuple.of(new UserAddCmd(), UserErrorCode.NOT_NULL)
+                , Tuple.of(new UserAddCmd(createUser("")), UserErrorCode.NOT_NULL_NAME)
+                , Tuple.of(cmd, UserErrorCode.ALREADY_EXISTS)
+        );
+    }
+
+    @Order(2)
+    @RepeatedTest(value = TenantApiTest.TEST_NUM, name = "第{currentRepetition}次修改")
+    public void update(RepetitionInfo info) {
+        int index = info.getCurrentRepetition();
+        UserUpdateCmd cmd = new UserUpdateCmd(createUser("user" + index, "name" + index));
+        Assertions.success(api::update, cmd);
+        Assertions.error(api::update
+                , Tuple.of(null, UserErrorCode.NOT_NULL)
+                , Tuple.of(new UserUpdateCmd(), UserErrorCode.NOT_NULL)
+                , Tuple.of(new UserUpdateCmd(createUser("")), UserErrorCode.NOT_NULL_ID_OR_NAME)
+                , Tuple.of(new UserUpdateCmd(createUser("xxx")), UserErrorCode.NOT_EXIST)
+        );
+    }
+
+    @Order(3)
+    @Test
+    public void join() {
+        UserUniqueDTO user = new UserUniqueDTO(null, "user1");
+        List<TenantUniqueDTO> tenant = List.of(new TenantUniqueDTO(null, "code1"));
+        Assertions.success(api::join, new UserJoinTenantCmd(user, tenant));
+        // 加入不存在的租户不会报错,但是加不进去
+        Assertions.success(api::join, new UserJoinTenantCmd(user, List.of(new TenantUniqueDTO(null, "xxxx"))));
+        Assertions.error(api::join
+                , Tuple.of(null, UserErrorCode.NOT_NULL)
+                , Tuple.of(new UserJoinTenantCmd(), UserErrorCode.NOT_NULL)
+                , Tuple.of(new UserJoinTenantCmd(user, null), TenantErrorCode.NOT_NULL)
+                , Tuple.of(new UserJoinTenantCmd(null, tenant), UserErrorCode.NOT_NULL)
+                , Tuple.of(new UserJoinTenantCmd(new UserUniqueDTO(null, ""), tenant), UserErrorCode.NOT_NULL_ID_OR_NAME)
+                , Tuple.of(new UserJoinTenantCmd(new UserUniqueDTO(null, "xxxx"), tenant), UserErrorCode.NOT_EXIST)
+                , Tuple.of(new UserJoinTenantCmd(user, List.of(new TenantUniqueDTO(null, ""))), TenantErrorCode.NOT_NULL_ID_OR_CODE)
+        );
+    }
+
+    @Order(4)
+    @RepeatedTest(value = TenantApiTest.TEST_NUM, name = "第{currentRepetition}次加入")
+    public void joinAll(RepetitionInfo info) {
+        List<TenantUniqueDTO> tenants = IntStream.range(1, TenantApiTest.TEST_NUM)
+                .mapToObj(i -> new TenantUniqueDTO(null, "code" + i))
+                .toList();
+        UserUniqueDTO user = new UserUniqueDTO(null, "user" + info.getCurrentRepetition());
+        Assertions.success(api::join, new UserJoinTenantCmd(user, tenants));
+    }
+
+    @Test
+    @Order(5)
+    public void get() {
+        Assertions.error(api::get, LoginErrorCode.NOT_LOGIN);
+        try (MockedStatic<JwtTokenUtil> jwt = Mockito.mockStatic(JwtTokenUtil.class)) {
+            jwt.when(JwtTokenUtil::getTokenOrElseThrow).thenReturn(JwtToken.builder().user("user5").build());
+            Assertions.success(api::get);
+            jwt.when(JwtTokenUtil::getTokenOrElseThrow).thenReturn(new JwtToken());
+            Assertions.error(api::get, UserErrorCode.NOT_NULL_ID_OR_NAME);
+            jwt.when(JwtTokenUtil::getTokenOrElseThrow).thenReturn(JwtToken.builder().user("xxx").build());
+            Assertions.error(api::get, UserErrorCode.NOT_EXIST);
+        }
+    }
+
+    @Test
+    @Order(10)
+    public void list() {
+        Integer size = 2;
+        UserListByTenantPageQuery query = new UserListByTenantPageQuery();
+        query.setPageIndex(3);
+        query.setPageSize(size);
+        query.setTenant(new TenantUniqueDTO(null, "code1"));
+        query.setOrderBy("GROUPCODE");
+        Assertions.assertEquals(api.list(query).getData().size(), size);
+        Assertions.error(api::list
+                , Tuple.of(null, TenantErrorCode.NOT_NULL)
+                , Tuple.of(new UserListByTenantPageQuery(), TenantErrorCode.NOT_NULL)
+                , Tuple.of(new UserListByTenantPageQuery(new TenantUniqueDTO(null, "")), TenantErrorCode.NOT_NULL_ID_OR_CODE)
+        );
+        Assertions.assertEquals(api.list(new UserListByTenantPageQuery(new TenantUniqueDTO(null, "code1"))).getTotalCount(), TenantApiTest.TEST_NUM);
+        Assertions.assertEquals(api.list(new UserListByTenantPageQuery(new TenantUniqueDTO(null, "xxx"))).getTotalCount(), 0);
+    }
+
+    private static UserDTO createUser(String name) {
+        return createUser(name, null);
+    }
+
+    private static UserDTO createUser(String name, String nick) {
+        return UserDTO.builder()
+                .name(name)
+                .nickName(nick)
+                .build();
+    }
+}

+ 3 - 0
start/src/test/resources/application.yml

@@ -26,6 +26,9 @@ spring:
 logging:
   level:
     com.hosea.service.infra: debug
+    com.alibaba.cola.catchlog.CatchLogAspect: warn
+  pattern:
+    console: "%clr(%d{${LOG_DATEFORMAT_PATTERN}}){faint} %highlight(%-5level) %clr(${PID}){magenta} %clr(---){faint} %clr(%applicationName[%15.15t]){faint} %clr(${LOG_CORRELATION_PATTERN:}){faint} %clr(%-40.40logger{39}){cyan} : %m%n"
   file:
     path:
     name: