数据从内存数据库中自动删除
Data is autodeleted from in-memory database
我使用 HSQLDB 进行测试。问题是,当我在 init()
方法中添加一些数据时,我只能从首先执行 运行 的测试中获取该数据。
@Before
public 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);
}
@Test
public void findUserByIdTest() {
User user = userDAO.findByUsername("User");
assertEquals(userDAO.findById(user.getId()), user);
}
@Test
public 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);
}
@Test
public void updateUserTest() {
User user = userDAO.findByUsername("User");
user.setCredits(0);
assertEquals(userDAO.findByUsername("User").getCredits(), (Integer) 0);
}
@Test
public void removeUserTest() {
userDAO.remove(userDAO.findByUsername("User"));
assertNull(userDAO.findByUsername("User"));
}
碰巧 removeUserTest()
方法总是先 运行,当我 findAll()
数据时,我会看到我在 init()
方法中设置的数据。在那之后,其他人测试方法 运行 但如果我在那里做 findAll()
,它只是 returns 没有任何数据存在。
另外我设置了hibernate.hbm2ddl.auto=create。
我在这里错过了什么?为什么我可以在第一个 运行ning 方法中获取数据,但在其他方法中数据就消失了。
预期:Spring 存储库测试是事务性的,默认情况下事务在每个测试结束时回滚。
即使您选择不回滚,每个测试都应该独立于其他测试,并且应该能够 运行 单独进行。您也不应该依赖执行顺序。如果先 removeUserTest()
运行,您的 findUserByIdTest()
就会失败。
因此,首先清理数据库并在每次测试前插入测试数据。如果每次测试后让Spring回滚,则不需要清洗,但还是应该在每次测试前插入测试数据。
递增 ID 应该不是问题:您只需要在测试字段中搅拌创建的实体或它们的 ID,并引用这些实体及其 ID,而不是在测试中使用硬编码 ID。
我使用 HSQLDB 进行测试。问题是,当我在 init()
方法中添加一些数据时,我只能从首先执行 运行 的测试中获取该数据。
@Before
public 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);
}
@Test
public void findUserByIdTest() {
User user = userDAO.findByUsername("User");
assertEquals(userDAO.findById(user.getId()), user);
}
@Test
public 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);
}
@Test
public void updateUserTest() {
User user = userDAO.findByUsername("User");
user.setCredits(0);
assertEquals(userDAO.findByUsername("User").getCredits(), (Integer) 0);
}
@Test
public void removeUserTest() {
userDAO.remove(userDAO.findByUsername("User"));
assertNull(userDAO.findByUsername("User"));
}
碰巧 removeUserTest()
方法总是先 运行,当我 findAll()
数据时,我会看到我在 init()
方法中设置的数据。在那之后,其他人测试方法 运行 但如果我在那里做 findAll()
,它只是 returns 没有任何数据存在。
另外我设置了hibernate.hbm2ddl.auto=create。
我在这里错过了什么?为什么我可以在第一个 运行ning 方法中获取数据,但在其他方法中数据就消失了。
预期:Spring 存储库测试是事务性的,默认情况下事务在每个测试结束时回滚。
即使您选择不回滚,每个测试都应该独立于其他测试,并且应该能够 运行 单独进行。您也不应该依赖执行顺序。如果先 removeUserTest()
运行,您的 findUserByIdTest()
就会失败。
因此,首先清理数据库并在每次测试前插入测试数据。如果每次测试后让Spring回滚,则不需要清洗,但还是应该在每次测试前插入测试数据。
递增 ID 应该不是问题:您只需要在测试字段中搅拌创建的实体或它们的 ID,并引用这些实体及其 ID,而不是在测试中使用硬编码 ID。