我使用 HSQLDB 进行测试。问题是,当我在init()方法中添加一些数据时,我只能从首先运行的测试中获取该数据。@Beforepublic void init() { if(isRun) return; isRun = true; Role role = new Role(); role.setId(1); role.setType("User"); roleDAO.save(role); User user = new User(); user.setCredits(1000); user.setEmail("User@test.com"); user.setUsername("User"); user.setPassword("qwerty"); user.setRoles(new HashSet<Role>(Arrays.asList(roleDAO.findById(1)))); userDAO.save(user); User user2 = new User(); user2.setCredits(1000); user2.setEmail("User2@test.com"); user2.setUsername("User2"); user2.setPassword("qwerty"); user2.setRoles(new HashSet<Role>(Arrays.asList(roleDAO.findById(1)))); userDAO.save(user2);}@Testpublic void findUserByIdTest() { User user = userDAO.findByUsername("User"); assertEquals(userDAO.findById(user.getId()), user);}@Testpublic void addUserTest() { User user = new User(); user.setCredits(1000); user.setEmail("Antony@test.com"); user.setPassword("qwerty"); user.setUsername("Antony"); user.setRoles(new HashSet<Role>(Arrays.asList(roleDAO.findById(1)))); userDAO.save(user); assertEquals(userDAO.findByUsername("Antony"), user);}@Testpublic void updateUserTest() { User user = userDAO.findByUsername("User"); user.setCredits(0); assertEquals(userDAO.findByUsername("User").getCredits(), (Integer) 0);}@Testpublic void removeUserTest() { userDAO.remove(userDAO.findByUsername("User")); assertNull(userDAO.findByUsername("User"));}碰巧该removeUserTest()方法总是首先运行,当我findAll()数据时,我会看到我在init()方法中设置的数据。之后,其他测试方法运行,但如果我在findAll()那里运行,它只会返回任何内容,这意味着不存在数据。另外,我已经设置了 hibernate.hbm2ddl.auto=create。我在这里错过了什么?为什么我可以在第一个运行方法中获取数据,但在其他方法中数据就消失了。
1 回答

holdtom
TA贡献1805条经验 获得超10个赞
预期:Spring 存储库测试是事务性的,并且默认情况下在每个测试结束时回滚事务。
即使您选择不回滚,每个测试都应该独立于其他测试,并且应该能够单独运行。您也不应该依赖执行顺序。findUserByIdTest()
如果removeUserTest()
先运行,您将失败。
因此,首先要清理数据库并在每次测试之前插入测试数据。如果每次测试后都让 Spring 回滚,则不需要清理,但仍应在每次测试前插入测试数据。
递增 ID 应该不是问题:您只需要在测试的字段中将创建的实体或它们的 ID 搅动,并在测试中引用这些实体及其 ID,而不是使用硬编码的 ID。
添加回答
举报
0/150
提交
取消