Данные автоматически удаляются из базы данных в памяти - PullRequest
0 голосов
/ 28 октября 2018

Я использую 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 голосов
/ 28 октября 2018

Ожидается: тесты репозитория Spring являются транзакционными, и транзакция откатывается в конце каждого теста по умолчанию.

Даже если вы решите не выполнять откат, каждый тест должен быть независимым от других и должен выполняться в одиночку.Вы также не должны полагаться на порядок исполнения.Ваш findUserByIdTest() потерпит неудачу, если removeUserTest() будет запущен первым.

Итак, начните с очистки базы данных и вставляйте тестовые данные перед каждым тестом.Если вы разрешаете откат Spring после каждого теста, очистка не требуется, но вы все равно должны вставлять данные теста перед каждым тестом.

Увеличение идентификаторов не должно быть проблемой: вам просто нужно поместить созданные объекты или их идентификаторы в поля теста и ссылаться на эти объекты и их идентификаторы вместо использования жестко закодированных идентификаторов в тесте.

...