diff --git a/src/test/java/cheattest/cheatsystest.java b/src/test/java/cheattest/cheatsystest.java
index 4f3a035..98ebf73 100644
--- a/src/test/java/cheattest/cheatsystest.java
+++ b/src/test/java/cheattest/cheatsystest.java
@@ -30,6 +30,7 @@
 import entity.config;
 
 public class cheatsystest {
+
     private static EntityManagerFactory emf;
     private static EntityManager em;
     private static Cheat cheat;
@@ -43,19 +44,15 @@
         Map<String, Object> props = new HashMap<>();
         config cfg = new config();
         String jdbcUrl = String.format(
-            "jdbc:mysql://%s/%s?useSSL=false&serverTimezone=UTC",
-            cfg.SqlURL, cfg.TestDatabase);
+                "jdbc:mysql://%s/%s?useSSL=false&serverTimezone=UTC",
+                cfg.SqlURL, cfg.TestDatabase);
         props.put("javax.persistence.jdbc.url", jdbcUrl);
         props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
         props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
         props.put("javax.persistence.jdbc.driver", "com.mysql.cj.jdbc.Driver");
         emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
         em = emf.createEntityManager();
-        cheat = new Cheat();
-        // 通过反射注入 entityManager
-        java.lang.reflect.Field f = Cheat.class.getDeclaredField("entityManager");
-        f.setAccessible(true);
-        f.set(cheat, em);
+        cheat = new Cheat(emf);
     }
 
     @AfterAll
@@ -88,7 +85,7 @@
         if (em != null && em.isOpen()) {
             em.getTransaction().begin();
             List<String> insertedUserIds = em.createQuery("SELECT u.userid FROM User u WHERE u.accountstate = true", String.class)
-                                             .getResultList();
+                    .getResultList();
             for (String userId : insertedUserIds) {
                 User user = em.find(User.class, userId);
                 if (user != null) {
@@ -99,54 +96,58 @@
         }
 
         // 关闭 EntityManager 和 EntityManagerFactory
-        if (em != null && em.isOpen()) em.close();
-        if (emf != null && emf.isOpen()) emf.close();
+        if (em != null && em.isOpen()) {
+            em.close();
+        }
+        if (emf != null && emf.isOpen()) {
+            emf.close();
+        }
     }
 
     @TestFactory
     Collection<DynamicTest> testAddAppeal() {
         // 查询数据库中已存在的一个用户
         String userId = em.createQuery("SELECT u.userid FROM User u", String.class)
-                          .setMaxResults(1)
-                          .getSingleResult();
+                .setMaxResults(1)
+                .getSingleResult();
 
         return IntStream.range(0, 10)
-            .mapToObj(i -> DynamicTest.dynamicTest("AddAppeal test #" + i, () -> {
-                // 插入 Appeal
-                String appealId = UUID.randomUUID().toString();
-                Appeal appeal = new Appeal();
-                appeal.appealid = appealId;
-                appeal.appealuserid = userId;
-                appeal.content = "Test appeal content " + i;
-                appeal.fileURL = "http://example.com/file" + i;
-                appeal.status = 0;
+                .mapToObj(i -> DynamicTest.dynamicTest("AddAppeal test #" + i, () -> {
+            // 插入 Appeal
+            String appealId = UUID.randomUUID().toString();
+            Appeal appeal = new Appeal();
+            appeal.appealid = appealId;
+            appeal.appealuserid = userId;
+            appeal.content = "Test appeal content " + i;
+            appeal.fileURL = "http://example.com/file" + i;
+            appeal.status = 0;
 
-                em.getTransaction().begin();
-                boolean result = cheat.AddAppeal(appeal);
-                em.getTransaction().commit();
+            em.getTransaction().begin();
+            boolean result = cheat.AddAppeal(appeal);
+            em.getTransaction().commit();
 
-                Assertions.assertTrue(result, "AddAppeal 应返回 true");
+            Assertions.assertTrue(result, "AddAppeal 应返回 true");
 
-                // 验证 Appeal 是否插入
-                Appeal fetched = em.find(Appeal.class, appealId);
-                Assertions.assertNotNull(fetched, "数据库应能查到新插入的 Appeal");
-                Assertions.assertEquals(userId, fetched.appealuserid);
-                Assertions.assertEquals("Test appeal content " + i, fetched.content);
+            // 验证 Appeal 是否插入
+            Appeal fetched = em.find(Appeal.class, appealId);
+            Assertions.assertNotNull(fetched, "数据库应能查到新插入的 Appeal");
+            Assertions.assertEquals(userId, fetched.appealuserid);
+            Assertions.assertEquals("Test appeal content " + i, fetched.content);
 
-                // 清理
-                em.getTransaction().begin();
-                em.remove(fetched);
-                em.getTransaction().commit();
-            }))
-            .collect(Collectors.toList());
+            // 清理
+            em.getTransaction().begin();
+            em.remove(fetched);
+            em.getTransaction().commit();
+        }))
+                .collect(Collectors.toList());
     }
 
     @TestFactory
     Collection<DynamicTest> testGetAppeal() {
         // 查询数据库中已存在的10个Appeal
         List<Appeal> appeals = em.createQuery("SELECT a FROM Appeal a", Appeal.class)
-                             .setMaxResults(10)
-                             .getResultList();
+                .setMaxResults(10)
+                .getResultList();
 
         List<DynamicTest> tests = new ArrayList<>();
 
@@ -178,140 +179,140 @@
     Collection<DynamicTest> testGetAppealList() {
         // 查询数据库中已存在的一个用户
         String userId = em.createQuery("SELECT u.userid FROM User u", String.class)
-                      .setMaxResults(1)
-                      .getSingleResult();
+                .setMaxResults(1)
+                .getSingleResult();
         // 用于记录测试过程中插入的 Appeal ID
 
         return IntStream.range(0, 10)
-            .mapToObj(i -> DynamicTest.dynamicTest("GetAppealList test #" + i, () -> {
-                // 插入一个新的 Appeal
-                String appealId = UUID.randomUUID().toString();
-                Appeal appeal = new Appeal();
-                appeal.appealid = appealId;
-                appeal.appealuserid = userId;
-                appeal.content = "GetAppealList test content " + i;
-                appeal.fileURL = "http://example.com/file" + i;
-                appeal.status = 0;
+                .mapToObj(i -> DynamicTest.dynamicTest("GetAppealList test #" + i, () -> {
+            // 插入一个新的 Appeal
+            String appealId = UUID.randomUUID().toString();
+            Appeal appeal = new Appeal();
+            appeal.appealid = appealId;
+            appeal.appealuserid = userId;
+            appeal.content = "GetAppealList test content " + i;
+            appeal.fileURL = "http://example.com/file" + i;
+            appeal.status = 0;
 
-                em.getTransaction().begin();
-                em.persist(appeal);
-                em.getTransaction().commit();
+            em.getTransaction().begin();
+            em.persist(appeal);
+            em.getTransaction().commit();
 
-                // 记录插入的 Appeal ID
-                insertedAppealIds.add(appealId);
+            // 记录插入的 Appeal ID
+            insertedAppealIds.add(appealId);
 
-                // 调用 GetAppealList 并验证
-                Appeal[] appeals = cheat.GetAppealList();
-                Assertions.assertNotNull(appeals, "GetAppealList 应返回非空");
+            // 调用 GetAppealList 并验证
+            Appeal[] appeals = cheat.GetAppealList();
+            Assertions.assertNotNull(appeals, "GetAppealList 应返回非空");
 
-                // 检查整个列表是否包含所有插入的数据
-                for (String id : insertedAppealIds) {
-                    boolean found = Arrays.stream(appeals)
-                                           .anyMatch(a -> a.appealid.equals(id));
-                    Assertions.assertTrue(found, "GetAppealList 应包含插入的 Appeal ID: " + id);
-                }
-            }))
-            .collect(Collectors.toList());
+            // 检查整个列表是否包含所有插入的数据
+            for (String id : insertedAppealIds) {
+                boolean found = Arrays.stream(appeals)
+                        .anyMatch(a -> a.appealid.equals(id));
+                Assertions.assertTrue(found, "GetAppealList 应包含插入的 Appeal ID: " + id);
+            }
+        }))
+                .collect(Collectors.toList());
     }
 
     @TestFactory
     Collection<DynamicTest> testHandleAppeal() {
         // 查询数据库中已存在的一个用户
         String userId = em.createQuery("SELECT u.userid FROM User u", String.class)
-                          .setMaxResults(1)
-                          .getSingleResult();
+                .setMaxResults(1)
+                .getSingleResult();
 
         return IntStream.range(0, 10)
-            .mapToObj(i -> DynamicTest.dynamicTest("HandleAppeal test #" + i, () -> {
-                // 插入一个新的 Appeal
-                String appealId = UUID.randomUUID().toString();
-                Appeal appeal = new Appeal();
-                appeal.appealid = appealId;
-                appeal.appealuserid = userId;
-                appeal.content = "HandleAppeal test content " + i;
-                appeal.fileURL = "http://example.com/file" + i;
-                appeal.status = 0;
+                .mapToObj(i -> DynamicTest.dynamicTest("HandleAppeal test #" + i, () -> {
+            // 插入一个新的 Appeal
+            String appealId = UUID.randomUUID().toString();
+            Appeal appeal = new Appeal();
+            appeal.appealid = appealId;
+            appeal.appealuserid = userId;
+            appeal.content = "HandleAppeal test content " + i;
+            appeal.fileURL = "http://example.com/file" + i;
+            appeal.status = 0;
 
+            em.getTransaction().begin();
+            em.persist(appeal);
+            em.getTransaction().commit();
+
+            // 如果 newStatus 为 1，先将用户的 account_status 设置为 true
+            if (i % 2 == 0) { // 偶数索引对应 newStatus = 1
                 em.getTransaction().begin();
-                em.persist(appeal);
+                User user = em.find(User.class, userId);
+                Assertions.assertNotNull(user, "数据库应能查到相关用户");
+                user.accountstate = true; // 设置为 true
                 em.getTransaction().commit();
+            }
 
-                // 如果 newStatus 为 1，先将用户的 account_status 设置为 true
-                if (i % 2 == 0) { // 偶数索引对应 newStatus = 1
-                    em.getTransaction().begin();
-                    User user = em.find(User.class, userId);
-                    Assertions.assertNotNull(user, "数据库应能查到相关用户");
-                    user.accountstate = true; // 设置为 true
-                    em.getTransaction().commit();
-                }
+            // 测试处理申诉
+            int newStatus = (i % 2 == 0) ? 1 : 2; // 偶数索引通过申诉，奇数索引拒绝申诉
+            boolean result = cheat.HandleAppeal(appealId, newStatus);
+            Assertions.assertTrue(result, "HandleAppeal 应返回 true");
 
-                // 测试处理申诉
-                int newStatus = (i % 2 == 0) ? 1 : 2; // 偶数索引通过申诉，奇数索引拒绝申诉
-                boolean result = cheat.HandleAppeal(appealId, newStatus);
-                Assertions.assertTrue(result, "HandleAppeal 应返回 true");
+            // 验证 Appeal 状态是否更新
+            Appeal updatedAppeal = em.find(Appeal.class, appealId);
+            Assertions.assertNotNull(updatedAppeal, "数据库应能查到更新后的 Appeal");
+            Assertions.assertEquals(newStatus, updatedAppeal.status, "Appeal 的状态应被更新为: " + newStatus);
 
-                // 验证 Appeal 状态是否更新
-                Appeal updatedAppeal = em.find(Appeal.class, appealId);
-                Assertions.assertNotNull(updatedAppeal, "数据库应能查到更新后的 Appeal");
-                Assertions.assertEquals(newStatus, updatedAppeal.status, "Appeal 的状态应被更新为: " + newStatus);
+            // 如果申诉通过，验证用户的 account_status 是否被设置为 false
+            if (newStatus == 1) {
+                User user = em.find(User.class, userId);
+                Assertions.assertNotNull(user, "数据库应能查到相关用户");
+                Assertions.assertFalse(user.accountstate, "通过申诉后用户的 account_status 应为 false");
+            }
 
-                // 如果申诉通过，验证用户的 account_status 是否被设置为 false
-                if (newStatus == 1) {
-                    User user = em.find(User.class, userId);
-                    Assertions.assertNotNull(user, "数据库应能查到相关用户");
-                    Assertions.assertFalse(user.accountstate, "通过申诉后用户的 account_status 应为 false");
-                }
-
-                // 清理测试数据
-                em.getTransaction().begin();
-                em.remove(updatedAppeal);
-                em.getTransaction().commit();
-            }))
-            .collect(Collectors.toList());
+            // 清理测试数据
+            em.getTransaction().begin();
+            em.remove(updatedAppeal);
+            em.getTransaction().commit();
+        }))
+                .collect(Collectors.toList());
     }
 
     @TestFactory
     Collection<DynamicTest> testGetFakeSeed() {
         return IntStream.range(0, 10)
-            .mapToObj(i -> DynamicTest.dynamicTest("GetFakeSeed test #" + i, () -> {
-                // 插入一个新的假种子
-                String seedId = UUID.randomUUID().toString();
-                String userId = em.createQuery("SELECT u.userid FROM User u", String.class)
-                                  .setMaxResults(1)
-                                  .getSingleResult();
+                .mapToObj(i -> DynamicTest.dynamicTest("GetFakeSeed test #" + i, () -> {
+            // 插入一个新的假种子
+            String seedId = UUID.randomUUID().toString();
+            String userId = em.createQuery("SELECT u.userid FROM User u", String.class)
+                    .setMaxResults(1)
+                    .getSingleResult();
 
-                Seed seed = new Seed();
-                seed.seedid = seedId;
-                seed.seeduserid = userId;
-                seed.faketime = 100 + i; // 设置为大于 config.FakeTime 的值
-                seed.lastfakecheck = new Date();
-                seed.outurl = "http://example.com/fake" + i;
-                seed.title = "Fake Seed " + i;
-                seed.subtitle = "Subtitle " + i;
-                seed.seedsize = "100MB";
-                seed.seedtag = "test,fake";
-                seed.downloadtimes = 0;
-                seed.url = "http://example.com/seed" + i;
+            Seed seed = new Seed();
+            seed.seedid = seedId;
+            seed.seeduserid = userId;
+            seed.faketime = 100 + i; // 设置为大于 config.FakeTime 的值
+            seed.lastfakecheck = new Date();
+            seed.outurl = "http://example.com/fake" + i;
+            seed.title = "Fake Seed " + i;
+            seed.subtitle = "Subtitle " + i;
+            seed.seedsize = "100MB";
+            seed.seedtag = "test,fake";
+            seed.downloadtimes = 0;
+            seed.url = "http://example.com/seed" + i;
 
-                em.getTransaction().begin();
-                em.persist(seed);
-                em.getTransaction().commit();
+            em.getTransaction().begin();
+            em.persist(seed);
+            em.getTransaction().commit();
 
-                // 记录插入的 Seed ID
-                insertedSeedIds.add(seedId);
+            // 记录插入的 Seed ID
+            insertedSeedIds.add(seedId);
 
-                // 调用 GetFakeSeed 并验证
-                Pair<String, String>[] fakeSeeds = cheat.GetFakeSeed();
-                Assertions.assertNotNull(fakeSeeds, "GetFakeSeed 应返回非空");
+            // 调用 GetFakeSeed 并验证
+            Pair<String, String>[] fakeSeeds = cheat.GetFakeSeed();
+            Assertions.assertNotNull(fakeSeeds, "GetFakeSeed 应返回非空");
 
-                // 验证返回的假种子列表是否包含所有插入的假种子
-                for (String id : insertedSeedIds) {
-                    boolean found = Arrays.stream(fakeSeeds)
-                                           .anyMatch(pair -> pair.getLeft().equals(id));
-                    Assertions.assertTrue(found, "GetFakeSeed 应包含插入的假种子 ID: " + id);
-                }
-            }))
-            .collect(Collectors.toList());
+            // 验证返回的假种子列表是否包含所有插入的假种子
+            for (String id : insertedSeedIds) {
+                boolean found = Arrays.stream(fakeSeeds)
+                        .anyMatch(pair -> pair.getLeft().equals(id));
+                Assertions.assertTrue(found, "GetFakeSeed 应包含插入的假种子 ID: " + id);
+            }
+        }))
+                .collect(Collectors.toList());
     }
 
     @TestFactory
@@ -319,47 +320,47 @@
         List<String> insertedUserIds = new ArrayList<>(); // 用于记录插入的用户 ID
 
         return IntStream.range(0, 10)
-            .mapToObj(i -> DynamicTest.dynamicTest("GetPunishedUserList test #" + i, () -> {
-                // 插入一个新的用户，accountstate 设置为 true
-                String userId = UUID.randomUUID().toString();
-                User user = new User();
-                user.userid = userId;
-                user.email = "test" + i + "@example.com";
-                user.username = "TestUser" + i;
-                user.password = "password" + i;
-                user.sex = "M";
-                user.detectedCount = 0;
-                user.lastDetectedTime = new Date();
-                user.school = "TestSchool";
-                user.pictureurl = "http://example.com/avatar" + i;
-                user.profile = "Test profile " + i;
-                user.accountstate = true; // 设置为 true
-                user.invitetimes = 5;
+                .mapToObj(i -> DynamicTest.dynamicTest("GetPunishedUserList test #" + i, () -> {
+            // 插入一个新的用户，accountstate 设置为 true
+            String userId = UUID.randomUUID().toString();
+            User user = new User();
+            user.userid = userId;
+            user.email = "test" + i + "@example.com";
+            user.username = "TestUser" + i;
+            user.password = "password" + i;
+            user.sex = "M";
+            user.detectedCount = 0;
+            user.lastDetectedTime = new Date();
+            user.school = "TestSchool";
+            user.pictureurl = "http://example.com/avatar" + i;
+            user.profile = "Test profile " + i;
+            user.accountstate = true; // 设置为 true
+            user.invitetimes = 5;
 
-                // 创建并设置 UserPT 实例
-                UserPT userPT = new UserPT();
-                userPT.user = user; // 关联 User 实例
-                user.userPT = userPT;
+            // 创建并设置 UserPT 实例
+            UserPT userPT = new UserPT();
+            userPT.user = user; // 关联 User 实例
+            user.userPT = userPT;
 
-                em.getTransaction().begin();
-                em.persist(user);
-                em.persist(userPT); // 持久化 UserPT 实例
-                em.getTransaction().commit();
+            em.getTransaction().begin();
+            em.persist(user);
+            em.persist(userPT); // 持久化 UserPT 实例
+            em.getTransaction().commit();
 
-                // 记录插入的用户 ID
-                insertedUserIds.add(userId);
+            // 记录插入的用户 ID
+            insertedUserIds.add(userId);
 
-                // 调用 GetPunishedUserList 并验证
-                String[] punishedUsers = cheat.GetPunishedUserList();
-                Assertions.assertNotNull(punishedUsers, "GetPunishedUserList 应返回非空");
+            // 调用 GetPunishedUserList 并验证
+            String[] punishedUsers = cheat.GetPunishedUserList();
+            Assertions.assertNotNull(punishedUsers, "GetPunishedUserList 应返回非空");
 
-                // 验证返回的用户列表是否包含所有插入的用户
-                for (String id : insertedUserIds) {
-                    boolean found = Arrays.stream(punishedUsers).anyMatch(returnedId -> returnedId.equals(id));
-                    Assertions.assertTrue(found, "GetPunishedUserList 应包含插入的用户 ID: " + id);
-                }
-            }))
-            .collect(Collectors.toList());
+            // 验证返回的用户列表是否包含所有插入的用户
+            for (String id : insertedUserIds) {
+                boolean found = Arrays.stream(punishedUsers).anyMatch(returnedId -> returnedId.equals(id));
+                Assertions.assertTrue(found, "GetPunishedUserList 应包含插入的用户 ID: " + id);
+            }
+        }))
+                .collect(Collectors.toList());
     }
 
     @TestFactory
@@ -367,76 +368,76 @@
         List<String> insertedUserIds = new ArrayList<>(); // 用于记录插入的用户 ID
 
         return IntStream.range(0, 10)
-            .mapToObj(i -> DynamicTest.dynamicTest("PunishUser test #" + i, () -> {
-                // 配置参数
-                int cheatTime = config.CheatTime;
-                int fakeTime = config.FakeTime;
+                .mapToObj(i -> DynamicTest.dynamicTest("PunishUser test #" + i, () -> {
+            // 配置参数
+            int cheatTime = config.CheatTime;
+            int fakeTime = config.FakeTime;
 
-                // 插入用户 1（作弊用户）
-                String userId1 = UUID.randomUUID().toString();
-                User user1 = new User();
-                user1.userid = userId1;
-                user1.email = "cheater" + i + "_" + UUID.randomUUID().toString() + "@example.com"; // 确保唯一性
-                user1.username = "Cheater" + i;
-                user1.password = "password" + i;
-                user1.sex = "M";
-                user1.detectedCount = cheatTime + 1; // detectedCount 超过 cheatTime
-                user1.fakeDetectedCount = 0;
-                user1.lastDetectedTime = new Date();
-                user1.fakeLastDetectedTime = new Date();
-                user1.accountstate = false; // 初始状态为未封禁
-                user1.invitetimes = 5;
+            // 插入用户 1（作弊用户）
+            String userId1 = UUID.randomUUID().toString();
+            User user1 = new User();
+            user1.userid = userId1;
+            user1.email = "cheater" + i + "_" + UUID.randomUUID().toString() + "@example.com"; // 确保唯一性
+            user1.username = "Cheater" + i;
+            user1.password = "password" + i;
+            user1.sex = "M";
+            user1.detectedCount = cheatTime + 1; // detectedCount 超过 cheatTime
+            user1.fakeDetectedCount = 0;
+            user1.lastDetectedTime = new Date();
+            user1.fakeLastDetectedTime = new Date();
+            user1.accountstate = false; // 初始状态为未封禁
+            user1.invitetimes = 5;
 
-                // 创建并设置 UserPT 实例
-                UserPT userPT1 = new UserPT();
-                userPT1.user = user1; // 关联 User 实例
-                user1.userPT = userPT1;
+            // 创建并设置 UserPT 实例
+            UserPT userPT1 = new UserPT();
+            userPT1.user = user1; // 关联 User 实例
+            user1.userPT = userPT1;
 
-                // 插入用户 2（非作弊用户）
-                String userId2 = UUID.randomUUID().toString();
-                User user2 = new User();
-                user2.userid = userId2;
-                user2.email = "normal" + i + "_" + UUID.randomUUID().toString() + "@example.com"; // 确保唯一性
-                user2.username = "NormalUser" + i;
-                user2.password = "password" + i;
-                user2.sex = "F";
-                user2.detectedCount = 0;
-                user2.fakeDetectedCount = fakeTime - 1; // fakeDetectedCount 未超过 fakeTime
-                user2.lastDetectedTime = new Date();
-                user2.fakeLastDetectedTime = new Date();
-                user2.accountstate = false; // 初始状态为未封禁
-                user2.invitetimes = 5;
+            // 插入用户 2（非作弊用户）
+            String userId2 = UUID.randomUUID().toString();
+            User user2 = new User();
+            user2.userid = userId2;
+            user2.email = "normal" + i + "_" + UUID.randomUUID().toString() + "@example.com"; // 确保唯一性
+            user2.username = "NormalUser" + i;
+            user2.password = "password" + i;
+            user2.sex = "F";
+            user2.detectedCount = 0;
+            user2.fakeDetectedCount = fakeTime - 1; // fakeDetectedCount 未超过 fakeTime
+            user2.lastDetectedTime = new Date();
+            user2.fakeLastDetectedTime = new Date();
+            user2.accountstate = false; // 初始状态为未封禁
+            user2.invitetimes = 5;
 
-                // 创建并设置 UserPT 实例
-                UserPT userPT2 = new UserPT();
-                userPT2.user = user2; // 关联 User 实例
-                user2.userPT = userPT2;
+            // 创建并设置 UserPT 实例
+            UserPT userPT2 = new UserPT();
+            userPT2.user = user2; // 关联 User 实例
+            user2.userPT = userPT2;
 
-                em.getTransaction().begin();
-                em.persist(user1);
-                em.persist(userPT1); // 持久化 UserPT 实例
-                em.persist(user2);
-                em.persist(userPT2); // 持久化 UserPT 实例
-                em.getTransaction().commit();
+            em.getTransaction().begin();
+            em.persist(user1);
+            em.persist(userPT1); // 持久化 UserPT 实例
+            em.persist(user2);
+            em.persist(userPT2); // 持久化 UserPT 实例
+            em.getTransaction().commit();
 
-                // 记录插入的用户 ID
-                insertedUserIds.add(userId1);
-                insertedUserIds.add(userId2);
+            // 记录插入的用户 ID
+            insertedUserIds.add(userId1);
+            insertedUserIds.add(userId2);
 
-                // 调用 PunishUser 方法
-                cheat.PunishUser();
+            // 调用 PunishUser 方法
+            cheat.PunishUser();
 
-                // 验证用户 1 是否被封禁
-                User punishedUser1 = em.find(User.class, userId1);
-                Assertions.assertNotNull(punishedUser1, "数据库应能查到用户 1");
-                Assertions.assertTrue(punishedUser1.accountstate, "作弊用户应被封禁");
+            // 验证用户 1 是否被封禁
+            User punishedUser1 = em.find(User.class, userId1);
+            Assertions.assertNotNull(punishedUser1, "数据库应能查到用户 1");
+            Assertions.assertTrue(punishedUser1.accountstate, "作弊用户应被封禁");
 
-                // 验证用户 2 是否未被封禁
-                User punishedUser2 = em.find(User.class, userId2);
-                Assertions.assertNotNull(punishedUser2, "数据库应能查到用户 2");
-                Assertions.assertFalse(punishedUser2.accountstate, "非作弊用户不应被封禁");
-            }))
-            .collect(Collectors.toList());
+            // 验证用户 2 是否未被封禁
+            User punishedUser2 = em.find(User.class, userId2);
+            Assertions.assertNotNull(punishedUser2, "数据库应能查到用户 2");
+            Assertions.assertFalse(punishedUser2.accountstate, "非作弊用户不应被封禁");
+        }))
+                .collect(Collectors.toList());
     }
 
     // @TestFactory
@@ -444,7 +445,6 @@
     //     List<String> insertedUserIds = new ArrayList<>(); // 用于记录插入的用户 ID
     //     List<String> insertedSeedIds = new ArrayList<>(); // 用于记录插入的种子 ID
     //     List<String> insertedTransIds = new ArrayList<>(); // 用于记录插入的传输记录 ID
-
     //     return IntStream.range(0, 10)
     //         .mapToObj(i -> DynamicTest.dynamicTest("DetectTrans test #" + i, () -> {
     //             // 插入上传用户
@@ -461,12 +461,10 @@
     //             uploader.fakeLastDetectedTime = new Date();
     //             uploader.accountstate = false;
     //             uploader.invitetimes = 5;
-
     //             // 创建并设置 UserPT 实例
     //             UserPT uploaderPT = new UserPT();
     //             uploaderPT.user = uploader; // 关联 User 实例
     //             uploader.userPT = uploaderPT;
-
     //             // 插入下载用户
     //             String downloaderId = UUID.randomUUID().toString();
     //             User downloader = new User();
@@ -481,12 +479,10 @@
     //             downloader.fakeLastDetectedTime = new Date();
     //             downloader.accountstate = false;
     //             downloader.invitetimes = 5;
-
     //             // 创建并设置 UserPT 实例
     //             UserPT downloaderPT = new UserPT();
     //             downloaderPT.user = downloader; // 关联 User 实例
     //             downloader.userPT = downloaderPT;
-
     //             em.getTransaction().begin();
     //             em.persist(uploader);
     //             em.persist(uploaderPT); // 持久化 UserPT 实例
@@ -495,7 +491,6 @@
     //             em.getTransaction().commit();
     //             insertedUserIds.add(uploaderId);
     //             insertedUserIds.add(downloaderId);
-
     //             // 插入种子
     //             String seedId = UUID.randomUUID().toString();
     //             Seed seed = new Seed();
@@ -510,12 +505,10 @@
     //             seed.seedtag = "test";
     //             seed.downloadtimes = 0;
     //             seed.url = "http://example.com/seed" + i;
-
     //             em.getTransaction().begin();
     //             em.persist(seed);
     //             em.getTransaction().commit();
     //             insertedSeedIds.add(seedId);
-
     //             // 插入正常和异常的传输记录
     //             List<TransRecord> transRecords = new ArrayList<>();
     //             for (int j = 0; j < 15; j++) {
@@ -528,17 +521,14 @@
     //                 transRecord.download = (j < 13) ? 90 : 10; // 异常数据的上传量远大于下载量
     //                 transRecord.maxupload = 200;
     //                 transRecord.maxdownload = 200;
-
     //                 em.getTransaction().begin();
     //                 em.persist(transRecord);
     //                 em.getTransaction().commit();
     //                 insertedTransIds.add(transRecord.taskid);
     //                 transRecords.add(transRecord);
     //             }
-
     //             // 调用 DetectTrans 方法
     //             cheat.DetectTrans();
-
     //             // 验证下载用户的 detectedCount 是否增加
     //             User detectedDownloader = em.find(User.class, downloaderId);
     //             Assertions.assertNotNull(detectedDownloader, "数据库应能查到上传用户");
