修改Vip部分接口,实现Vip和DB1接口功能及单元测试,新增VipSeed和UserStar实体类

Change-Id: I0479a68f3ff8c8ccd0fd7e9e5894e5b48cb7ffec
diff --git a/src/test/java/viptest/vipsystest.java b/src/test/java/viptest/vipsystest.java
index 89a0555..3323b26 100644
--- a/src/test/java/viptest/vipsystest.java
+++ b/src/test/java/viptest/vipsystest.java
@@ -1,5 +1,595 @@
 package viptest;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Random;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.TestFactory;
+
+import entity.Seed;
+import entity.VipSeed;
+import vip.Vip;
+
 public class vipsystest {
-    
+    private static EntityManagerFactory emf;
+    private static EntityManager em;
+    private static Vip vip;
+    private static final int TEST_CASES = 10;
+
+    @BeforeAll
+    public static void setup() throws Exception {
+        Class.forName("com.mysql.cj.jdbc.Driver");
+        java.util.Map<String,Object> props = new HashMap<>();
+        String jdbcUrl = String.format(
+            "jdbc:mysql://%s/%s?useSSL=false&serverTimezone=UTC",
+            entity.config.SqlURL, entity.config.TestDatabase);
+        props.put("javax.persistence.jdbc.url", jdbcUrl);
+        props.put("javax.persistence.jdbc.user", entity.config.SqlUsername);
+        props.put("javax.persistence.jdbc.password", entity.config.SqlPassword);
+        props.put("javax.persistence.jdbc.driver", "com.mysql.cj.jdbc.Driver");
+        emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
+        em = emf.createEntityManager();
+        vip = new Vip();
+        java.lang.reflect.Field f = Vip.class.getDeclaredField("entitymanager");
+        f.setAccessible(true);
+        f.set(vip, em);
+    }
+
+    @AfterAll
+    public static void teardown() {
+        if (em != null && em.isOpen()) em.close();
+        if (emf != null && emf.isOpen()) emf.close();
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testAddFarmerNumber() {
+        Random rnd = new Random();
+        return IntStream.range(0, TEST_CASES)
+            .mapToObj(i -> DynamicTest.dynamicTest("AddFarmerNumber test #" + i, () -> {
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                String userId = "testuser-" + UUID.randomUUID();
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                String seedid = "testseed-" + UUID.randomUUID();
+                try {
+                    // 插入User
+                    entity.User user = new entity.User();
+                    user.userid = userId;
+                    user.email = userId + "@example.com";
+                    user.username = userId;
+                    user.password = "pwd";
+                    user.sex = "m";
+                    user.school = "school";
+                    user.pictureurl = null;
+                    user.profile = null;
+                    user.accountstate = false;
+                    user.invitetimes = 5;
+                    
+                    // 插入UserPT
+                    entity.UserPT userPT = new entity.UserPT();
+                    userPT.userid = userId;
+                    userPT.magic = 0;
+                    userPT.upload = 0L;
+                    userPT.download = 0L;
+                    userPT.share = 0.0;
+                    userPT.farmurl = null;
+                    userPT.viptime = 0;
+                    userPT.user = user;
+                    user.userPT = userPT;
+                    em.persist(user);
+                    em.persist(userPT);
+                    // 插入Seed
+                    entity.Seed seed = new entity.Seed();
+                    seed.seedid = seedid;
+                    seed.seeduserid = userId;
+                    seed.faketime = 0;
+                    seed.lastfakecheck = new java.util.Date();
+                    seed.outurl = "http://example.com/seed";
+                    seed.title = "title";
+                    seed.subtitle = "subtitle";
+                    seed.seedsize = "100MB";
+                    seed.seedtag = "tag";
+                    seed.downloadtimes = 0;
+                    seed.url = "http://download.com/seed";
+                    em.persist(seed);
+                    // 插入VipSeed
+                    VipSeed vs = new VipSeed();
+                    vs.seedid = seedid;
+                    vs.farmernumber = rnd.nextInt(10) + 1;
+                    vs.seedercount = 0;
+                    vs.rewardmagic = 0;
+                    vs.stopcaching = 0;
+                    vs.bonus = 0;
+                    vs.cachestate = false;
+                    vs.seed = seed;
+                    em.persist(vs);
+                    em.flush();
+                    int delta = rnd.nextInt(100) + 1;
+                    Integer before = em.createQuery(
+                        "select v.farmernumber from VipSeed v where v.seedid = :sid", Integer.class)
+                        .setParameter("sid", seedid).getSingleResult();
+                    int ret = vip.AddFarmerNumber(delta, seedid);
+                    Assertions.assertEquals(0, ret, "AddFarmerNumber 应返回0");
+                    em.flush();
+                    em.clear();
+                    Integer after = em.createQuery(
+                        "select v.farmernumber from VipSeed v where v.seedid = :sid", Integer.class)
+                        .setParameter("sid", seedid).getSingleResult();
+                    Assertions.assertEquals(Integer.valueOf(before + delta), after, "farmernumber 应增加");
+                } finally {
+                    tx.rollback();
+                }
+            })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testReduceFarmerNumber() {
+        Random rnd = new Random();
+        return IntStream.range(0, TEST_CASES)
+            .mapToObj(i -> DynamicTest.dynamicTest("ReduceFarmerNumber test #" + i, () -> {
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                String userId = "testuser-" + UUID.randomUUID();
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                String seedid = "testseed-" + UUID.randomUUID();
+                try {
+                    entity.User user = new entity.User();
+                    user.userid = userId;
+                    user.email = userId + "@example.com";
+                    user.username = userId;
+                    user.password = "pwd";
+                    user.sex = "m";
+                    user.school = "school";
+                    user.pictureurl = null;
+                    user.profile = null;
+                    user.accountstate = false;
+                    user.invitetimes = 5;
+                    
+                    entity.UserPT userPT = new entity.UserPT();
+                    userPT.userid = userId;
+                    userPT.magic = 0;
+                    userPT.upload = 0L;
+                    userPT.download = 0L;
+                    userPT.share = 0.0;
+                    userPT.farmurl = null;
+                    userPT.viptime = 0;
+                    userPT.user = user;
+                    user.userPT = userPT;
+                    em.persist(user);
+                    em.persist(userPT);
+                    entity.Seed seed = new entity.Seed();
+                    seed.seedid = seedid;
+                    seed.seeduserid = userId;
+                    seed.faketime = 0;
+                    seed.lastfakecheck = new java.util.Date();
+                    seed.outurl = "http://example.com/seed";
+                    seed.title = "title";
+                    seed.subtitle = "subtitle";
+                    seed.seedsize = "100MB";
+                    seed.seedtag = "tag";
+                    seed.downloadtimes = 0;
+                    seed.url = "http://download.com/seed";
+                    em.persist(seed);
+                    VipSeed vs = new VipSeed();
+                    vs.seedid = seedid;
+                    vs.farmernumber = rnd.nextInt(10) + 5;
+                    vs.seedercount = 0;
+                    vs.rewardmagic = 0;
+                    vs.stopcaching = 0;
+                    vs.bonus = 0;
+                    vs.cachestate = false;
+                    vs.seed = seed;
+                    em.persist(vs);
+                    em.flush();
+                    Integer before = em.createQuery(
+                        "select v.farmernumber from VipSeed v where v.seedid = :sid", Integer.class)
+                        .setParameter("sid", seedid).getSingleResult();
+                    int max = Math.max(before, 0);
+                    int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
+                    if (delta == 0) return;
+                    int ret = vip.ReduceFarmerNumber(delta, seedid);
+                    Assertions.assertEquals(0, ret, "ReduceFarmerNumber 应返回0");
+                    em.flush();
+                    em.clear();
+                    Integer after = em.createQuery(
+                        "select v.farmernumber from VipSeed v where v.seedid = :sid", Integer.class)
+                        .setParameter("sid", seedid).getSingleResult();
+                    Assertions.assertEquals(Integer.valueOf(before - delta), after, "farmernumber 应减少");
+                } finally {
+                    tx.rollback();
+                }
+            })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testRemoveSeed() {
+        return IntStream.range(0, TEST_CASES)
+            .mapToObj(i -> DynamicTest.dynamicTest("RemoveSeed test #" + i, () -> {
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                String userId = "testuser-" + UUID.randomUUID();
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                String seedid = "testseed-" + UUID.randomUUID();
+                try {
+                    entity.User user = new entity.User();
+                    user.userid = userId;
+                    user.email = userId + "@example.com";
+                    user.username = userId;
+                    user.password = "pwd";
+                    user.sex = "m";
+                    user.school = "school";
+                    user.pictureurl = null;
+                    user.profile = null;
+                    user.accountstate = false;
+                    user.invitetimes = 5;
+                    
+                    entity.UserPT userPT = new entity.UserPT();
+                    userPT.userid = userId;
+                    userPT.magic = 0;
+                    userPT.upload = 0L;
+                    userPT.download = 0L;
+                    userPT.share = 0.0;
+                    userPT.farmurl = null;
+                    userPT.viptime = 0;
+                    userPT.user = user;
+                    user.userPT = userPT;
+                    em.persist(user);
+                    em.persist(userPT);
+                    entity.Seed seed = new entity.Seed();
+                    seed.seedid = seedid;
+                    seed.seeduserid = userId;
+                    seed.faketime = 0;
+                    seed.lastfakecheck = new java.util.Date();
+                    seed.outurl = "http://example.com/seed";
+                    seed.title = "title";
+                    seed.subtitle = "subtitle";
+                    seed.seedsize = "100MB";
+                    seed.seedtag = "tag";
+                    seed.downloadtimes = 0;
+                    seed.url = "http://download.com/seed";
+                    em.persist(seed);
+                    VipSeed vs = new VipSeed();
+                    vs.seedid = seedid;
+                    vs.farmernumber = 5;
+                    vs.seedercount = 0;
+                    vs.rewardmagic = 0;
+                    vs.stopcaching = 0;
+                    vs.bonus = 0;
+                    vs.cachestate = false;
+                    vs.seed = seed;
+                    em.persist(vs);
+                    em.flush();
+                    VipSeed before = em.find(VipSeed.class, seedid);
+                    Assertions.assertNotNull(before, "VipSeed 应存在");
+                    int ret = vip.RemoveSeed(seedid);
+                    Assertions.assertEquals(0, ret, "RemoveSeed 应返回0");
+                    em.flush();
+                    em.clear();
+                    VipSeed after = em.find(VipSeed.class, seedid);
+                    Assertions.assertNull(after, "VipSeed 应被移除");
+                } finally {
+                    tx.rollback();
+                }
+            })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testCheckSeed() {
+        return IntStream.range(0, TEST_CASES)
+            .mapToObj(i -> DynamicTest.dynamicTest("CheckSeed test #" + i, () -> {
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                String userId = "testuser-" + UUID.randomUUID();
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                String seedid = "testseed-" + UUID.randomUUID();
+                try {
+                    entity.User user = new entity.User();
+                    user.userid = userId;
+                    user.email = userId + "@example.com";
+                    user.username = userId;
+                    user.password = "pwd";
+                    user.sex = "m";
+                    user.school = "school";
+                    user.pictureurl = null;
+                    user.profile = null;
+                    user.accountstate = false;
+                    user.invitetimes = 5;
+                    
+                    entity.UserPT userPT = new entity.UserPT();
+                    userPT.userid = userId;
+                    userPT.magic = 0;
+                    userPT.upload = 0L;
+                    userPT.download = 0L;
+                    userPT.share = 0.0;
+                    userPT.farmurl = null;
+                    userPT.viptime = 0;
+                    userPT.user = user;
+                    user.userPT = userPT;
+                    em.persist(user);
+                    em.persist(userPT);
+                    entity.Seed seed = new entity.Seed();
+                    seed.seedid = seedid;
+                    seed.seeduserid = userId;
+                    seed.faketime = 0;
+                    seed.lastfakecheck = new java.util.Date();
+                    seed.outurl = "http://example.com/seed";
+                    seed.title = "title";
+                    seed.subtitle = "subtitle";
+                    seed.seedsize = "100MB";
+                    seed.seedtag = "tag";
+                    seed.downloadtimes = 0;
+                    seed.url = "http://download.com/seed";
+                    em.persist(seed);
+                    VipSeed vs = new VipSeed();
+                    vs.seedid = seedid;
+                    vs.farmernumber = 1000;
+                    vs.seedercount = 0;
+                    vs.rewardmagic = 0;
+                    vs.stopcaching = 0;
+                    vs.bonus = 0;
+                    vs.cachestate = false;
+                    vs.seed = seed;
+                    em.persist(vs);
+                    em.flush();
+                    VipSeed vipSeed = em.find(VipSeed.class, seedid);
+                    Assertions.assertNotNull(vipSeed, "VipSeed 应存在");
+                    vip.CheckSeed();
+                    em.flush();
+                    em.clear();
+                    VipSeed after = em.find(VipSeed.class, seedid);
+                    Assertions.assertNull(after, "CheckSeed后超限VipSeed应被移除");
+                } finally {
+                    tx.rollback();
+                }
+            })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetSeedToPlant() {
+        return IntStream.range(0, TEST_CASES)
+            .mapToObj(i -> DynamicTest.dynamicTest("GetSeedToPlant test #" + i, () -> {
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                String userId = "testuser-" + UUID.randomUUID();
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                String seedid = "testseed-" + UUID.randomUUID();
+                try {
+                    entity.User user = new entity.User();
+                    user.userid = userId;
+                    user.email = userId + "@example.com";
+                    user.username = userId;
+                    user.password = "pwd";
+                    user.sex = "m";
+                    user.school = "school";
+                    user.pictureurl = null;
+                    user.profile = null;
+                    user.accountstate = false;
+                    user.invitetimes = 5;
+                    
+                    entity.UserPT userPT = new entity.UserPT();
+                    userPT.userid = userId;
+                    userPT.magic = 0;
+                    userPT.upload = 0L;
+                    userPT.download = 0L;
+                    userPT.share = 0.0;
+                    userPT.farmurl = null;
+                    userPT.viptime = 0;
+                    userPT.user = user;
+                    user.userPT = userPT;
+                    em.persist(user);
+                    em.persist(userPT);
+                    entity.Seed seed = new entity.Seed();
+                    seed.seedid = seedid;
+                    seed.seeduserid = userId;
+                    seed.faketime = 0;
+                    seed.lastfakecheck = new java.util.Date();
+                    seed.outurl = "http://example.com/seed";
+                    seed.title = "title";
+                    seed.subtitle = "subtitle";
+                    seed.seedsize = "100MB";
+                    seed.seedtag = "tag";
+                    seed.downloadtimes = 0;
+                    seed.url = "http://download.com/seed";
+                    em.persist(seed);
+                    VipSeed vs = new VipSeed();
+                    vs.seedid = seedid;
+                    vs.farmernumber = 5;
+                    vs.seedercount = 0;
+                    vs.rewardmagic = 0;
+                    vs.stopcaching = 0;
+                    vs.bonus = 0;
+                    vs.cachestate = false;
+                    vs.seed = seed;
+                    em.persist(vs);
+                    em.flush();
+                    VipSeed vipSeed = em.find(VipSeed.class, seedid);
+                    Assertions.assertNotNull(vipSeed, "VipSeed 应存在");
+                    Seed[] seeds = vip.GetSeedToPlant();
+                    boolean found = Arrays.stream(seeds).anyMatch(s -> s.seedid.equals(seedid));
+                    Assertions.assertTrue(found, "GetSeedToPlant 返回的种子应包含当前seedid");
+                } finally {
+                    tx.rollback();
+                }
+            })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetTTorent() {
+        return IntStream.range(0, TEST_CASES)
+            .mapToObj(i -> DynamicTest.dynamicTest("GetTTorent test #" + i, () -> {
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                String userId = "testuser-" + UUID.randomUUID();
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                String seedid = "testseed-" + UUID.randomUUID();
+                String ip = "127.0.0." + i;
+                java.io.File tempFile = null;
+                try {
+                    // 正常情况:用户、种子、文件都存在
+                    entity.User user = new entity.User();
+                    user.userid = userId;
+                    user.email = userId + "@example.com";
+                    user.username = userId;
+                    user.password = "pwd";
+                    user.sex = "m";
+                    user.school = "school";
+                    user.pictureurl = null;
+                    user.profile = null;
+                    user.accountstate = false;
+                    user.invitetimes = 5;
+                    entity.UserPT userPT = new entity.UserPT();
+                    userPT.userid = userId;
+                    userPT.magic = 0;
+                    userPT.upload = 0L;
+                    userPT.download = 0L;
+                    userPT.share = 0.0;
+                    userPT.farmurl = null;
+                    userPT.viptime = 0;
+                    userPT.user = user;
+                    user.userPT = userPT;
+                    em.persist(user);
+                    em.persist(userPT);
+                    entity.Seed seed = new entity.Seed();
+                    seed.seedid = seedid;
+                    seed.seeduserid = userId;
+                    seed.faketime = 0;
+                    seed.lastfakecheck = new java.util.Date();
+                    seed.outurl = "http://example.com/seed";
+                    seed.title = "title";
+                    seed.subtitle = "subtitle";
+                    seed.seedsize = "100MB";
+                    seed.seedtag = "tag";
+                    seed.downloadtimes = 0;
+                    em.persist(seed);
+                    VipSeed vs = new VipSeed();
+                    vs.seedid = seedid;
+                    vs.farmernumber = 1;
+                    vs.seedercount = 0;
+                    vs.rewardmagic = 0;
+                    vs.stopcaching = 0;
+                    vs.bonus = 0;
+                    vs.cachestate = false;
+                    vs.seed = seed;
+                    em.persist(vs);
+                    em.flush();
+                    tempFile = java.io.File.createTempFile(seedid + "_test", ".torrent");
+                    seed.url = tempFile.getAbsolutePath();
+                    em.merge(seed);
+                    em.flush();
+                    org.apache.commons.lang3.tuple.Pair<java.io.File, Integer> result = vip.GetTTorent(seedid, userId, ip);
+                    Assertions.assertNotNull(result, "GetTTorent 返回结果不应为null");
+                    Assertions.assertEquals(0, result.getRight().intValue(), "GetTTorent 应返回0");
+                    Assertions.assertNotNull(result.getLeft(), "GetTTorent 应返回文件对象");
+                    Assertions.assertEquals(tempFile.getAbsolutePath(), result.getLeft().getAbsolutePath(), "文件路径应一致");
+
+                    // 情况2:种子不存在
+                    org.apache.commons.lang3.tuple.Pair<java.io.File, Integer> result2 = vip.GetTTorent("notexist-seed", userId, ip);
+                    Assertions.assertNotNull(result2, "种子不存在时返回不应为null");
+                    Assertions.assertNull(result2.getLeft(), "种子不存在时文件应为null");
+                    Assertions.assertNotEquals(0, result2.getRight().intValue(), "种子不存在应返回非0");
+
+                    // 情况3:用户不存在
+                    org.apache.commons.lang3.tuple.Pair<java.io.File, Integer> result3 = vip.GetTTorent(seedid, "notexist-user", ip);
+                    Assertions.assertNotNull(result3, "用户不存在时返回不应为null");
+                    Assertions.assertNull(result3.getLeft(), "用户不存在时文件应为null");
+                    Assertions.assertNotEquals(0, result3.getRight().intValue(), "用户不存在应返回非0");
+
+                    // 情况4:文件路径不存在
+                    seed.url = null;
+                    em.merge(seed);
+                    em.flush();
+                    org.apache.commons.lang3.tuple.Pair<java.io.File, Integer> result4 = vip.GetTTorent(seedid, userId, ip);
+                    Assertions.assertNotNull(result4, "文件不存在时返回不应为null");
+                    Assertions.assertNull(result4.getLeft(), "文件不存在时文件应为null");
+                    Assertions.assertNotEquals(0, result4.getRight().intValue(), "文件不存在应返回非0");
+
+                    // 情况5:参数为空
+                    org.apache.commons.lang3.tuple.Pair<java.io.File, Integer> result5 = vip.GetTTorent(null, userId, ip);
+                    Assertions.assertNotNull(result5, "参数为空时返回不应为null");
+                    Assertions.assertNull(result5.getLeft(), "参数为空时文件应为null");
+                    Assertions.assertNotEquals(0, result5.getRight().intValue(), "参数为空应返回非0");
+                } finally {
+                    tx.rollback();
+                    if (tempFile != null && tempFile.exists()) tempFile.delete();
+                }
+            })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testKeepSeed() {
+        return IntStream.range(0, TEST_CASES)
+            .mapToObj(i -> DynamicTest.dynamicTest("KeepSeed test #" + i, () -> {
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                String userId = "user-" + UUID.randomUUID();
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                String seedid = "testseed-" + UUID.randomUUID();
+                try {
+                    // 插入User
+                    entity.User user = new entity.User();
+                    user.userid = userId;
+                    user.email = userId + "@example.com";
+                    user.username = userId;
+                    user.password = "pwd";
+                    user.sex = "m";
+                    user.school = "school";
+                    user.pictureurl = null;
+                    user.profile = null;
+                    user.accountstate = false;
+                    user.invitetimes = 5;
+                    // 插入UserPT
+                    entity.UserPT userPT = new entity.UserPT();
+                    userPT.userid = userId;
+                    userPT.magic = 0;
+                    userPT.upload = 0L;
+                    userPT.download = 0L;
+                    userPT.share = 0.0;
+                    userPT.farmurl = null;
+                    userPT.viptime = 0;
+                    userPT.user = user;
+                    user.userPT = userPT;
+                    em.persist(user);
+                    em.persist(userPT);
+                    // 插入Seed
+                    entity.Seed seed = new entity.Seed();
+                    seed.seedid = seedid;
+                    seed.seeduserid = userId;
+                    seed.faketime = 0;
+                    seed.lastfakecheck = new java.util.Date();
+                    seed.outurl = "http://example.com/seed";
+                    seed.title = "title";
+                    seed.subtitle = "subtitle";
+                    seed.seedsize = "100MB";
+                    seed.seedtag = "tag";
+                    seed.downloadtimes = 0;
+                    seed.url = "http://download.com/seed";
+                    em.persist(seed);
+                    em.flush();
+                    int ret = vip.KeepSeed(seedid);
+                    Assertions.assertEquals(0, ret, "KeepSeed 正常插入应返回0");
+                    VipSeed vs = em.find(VipSeed.class, seedid);
+                    Assertions.assertNotNull(vs, "VipSeed 应被插入");
+
+                    // 异常情况:种子不存在
+                    String notExistSeedId = "notexist-seed-" + UUID.randomUUID();
+                    int ret2 = vip.KeepSeed(notExistSeedId);
+                    Assertions.assertEquals(1, ret2, "种子不存在应返回1");
+                } finally {
+                    tx.rollback();
+                }
+            })).collect(Collectors.toList());
+    }
 }