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

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


慕丝7291255
浏览 175回答 1
1回答

holdtom

预期:Spring 存储库测试是事务性的,并且默认情况下在每个测试结束时回滚事务。即使您选择不回滚,每个测试都应该独立于其他测试,并且应该能够单独运行。您也不应该依赖执行顺序。findUserByIdTest()如果removeUserTest()先运行,您将失败。因此,首先要清理数据库并在每次测试之前插入测试数据。如果每次测试后都让 Spring 回滚,则不需要清理,但仍应在每次测试前插入测试数据。递增 ID 应该不是问题:您只需要在测试的字段中将创建的实体或它们的 ID 搅动,并在测试中引用这些实体及其 ID,而不是使用硬编码的 ID。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java