не могу удалить строку из тестового модуля базы данных весной - PullRequest
0 голосов
/ 19 мая 2019

Я тестирую метод удаления в своем классе обслуживания, и он не будет удалять строки из базы данных.Когда я использую тот же метод, когда приложение работает, оно работает нормально.Я использую плагин MySQL и H2database для тестирования приложения.Другие методы тестирования CRUD работают просто отлично.

Тестовый класс

@RunWith(SpringRunner.class)
@SpringBootTest
public class StudentAccountApplicationTests {

    @Autowired
    StudentAccountService studentAccountService;

     @Test
        public void testStudentAccountDeletion(){
            Student student1 = new Student ("john","smith","studying");
            Student student2 = new Student ("will","ferrel","finished");
            Student student3 = new Student ("louis","johnsson","finished");

            StudentAccount studentAccount1 = new StudentAccount ("josm","josm","studying", student1 );
            StudentAccount studentAccount2 = new StudentAccount ("wife","wife","studying", student2);
            StudentAccount studentAccount3 = new StudentAccount ("lojo","lojo","studying", student3);

            studentService.save(student1);
            studentService.save(student2);
            studentService.save(student3);

            studentAccountService.save(studentAccount1);
            studentAccountService.save(studentAccount2);
            studentAccountService.save(studentAccount3);

            List<StudentAccount> studentAccountsToDelete = studentAccountService.getStudentAccountsFromFinishedStudents();

            studentAccountService.deleteStudentAccountsFromFinishedStudents(studentAccountsToDelete);

            List<StudentAccount> studentAccountsAfterDeletion = studentAccountService.getAllStudentAccounts();

            assertEquals(1, studentAccountsAfterDeletion.size());
        }
}

StudentAccountServiceImpl

    public class StudentAccountServiceImpl implements StudentAccountService {
   @Autowired
    StudentAccountRepository studentAccountRepository;
        @Override
        public void deleteStudentAccount(StudentAccount studentToDelete) {
            studentAccountRepository.delete(studentToDelete);
        }

        @Override
        public void deleteStudentAccountsFromFinishedStudents(List<StudentAccount> studentAccountsToDelete) {
            studentAccountsToDelete.forEach(studentAccount -> {
                deleteStudentAccount(studentAccount);
            });
        }
    }

Тест не пройден, поскольку учетные записи студентов не удаляютсяпоэтому размер списка равен 3 вместо 1. Как указывалось ранее, метод studentAccountsToDelete работает нормально при запуске приложения.Я не знаю, в чем здесь разница, если все другие методы CRUD работают.Я предполагаю, что есть проблема с базой данных H2.Нужна помощь.Заранее спасибо

1 Ответ

0 голосов
/ 20 мая 2019

Нашел решение. Ответ в сущности, где происходит сопоставление. Кажется, что это распространенная ошибка при использовании отображения один ко многим, поэтому в сущности

Я изменил это:

@OneToMany(mappedBy = "student", cascade=CascadeType.ALL)
    private Collection<StudentAccount> studentAccounts;

К этому:

@OneToMany(mappedBy = "student", orphanRemoval=true)
    private Collection<StudentAccount> studentAccounts;

Обратите внимание, что я заменил cascade=CascadeType.ALL на orphanRemoval=true. Это говорит hibernate об удалении ссылки на объект, который больше не существует. Это очень полезно для очистки зависимых объектов. В моем случае, студент, который закончил свою карьеру, больше не нуждается в учетной записи студента. Надеюсь, этот ответ кому-нибудь поможет. Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...