我使用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()
,它将仅返回任何内容,表示没有数据。
另外,我设置了hibernate.hbm2ddl.auto = create。
我在这里想念什么?为什么我可以在第一种运行方法中获取数据,但在其他方法中数据却消失了。
答案 0 :(得分:3)
这是预料之中的:Spring存储库测试是事务性的,默认情况下,事务在每个测试结束时都会回滚。
即使您选择不回滚,每个测试也应该独立于其他测试,并且应该能够单独运行。您也不应依赖执行顺序。如果首先运行findUserByIdTest()
,则您的removeUserTest()
将失败。
因此,首先要清理数据库,并在每次测试之前插入测试数据。如果在每次测试后让Spring回滚,则无需清洗,但仍应在每次测试之前插入测试数据。
递增ID应该没有问题:您只需要在测试的字段中搅拌创建的实体或其ID,并引用这些实体及其ID,而不是在测试中使用硬编码的ID。