数据从内存数据库中自动删除

时间:2018-10-28 01:44:02

标签: java hibernate unit-testing junit hsqldb

我使用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。 我在这里想念什么?为什么我可以在第一种运行方法中获取数据,但在其他方法中数据却消失了。

1 个答案:

答案 0 :(得分:3)

这是预料之中的:Spring存储库测试是事务性的,默认情况下,事务在每个测试结束时都会回滚。

即使您选择不回滚,每个测试也应该独立于其他测试,并且应该能够单独运行。您也不应依赖执行顺序。如果首先运行findUserByIdTest(),则您的removeUserTest()将失败。

因此,首先要清理数据库,并在每次测试之前插入测试数据。如果在每次测试后让Spring回滚,则无需清洗,但仍应在每次测试之前插入测试数据。

递增ID应该没有问题:您只需要在测试的字段中搅拌创建的实体或其ID,并引用这些实体及其ID,而不是在测试中使用硬编码的ID。