首页 > 解决方案 > 春季无法从数据库单元测试中删除行

问题描述

我正在我的服务类中测试一个删除方法,它不会从数据库中删除行。当我在应用程序运行时使用相同的方法时,它工作正常。我正在使用 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 数据库存在问题。需要一些帮助。提前致谢

标签: springhibernatejunit

解决方案


找到了解决方案。答案在发生映射的实体中。在实体中使用一对多映射时,这似乎是一个常见错误

我改变了这个:

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

对此:

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

请注意,我为此替换cascade=CascadeType.ALLorphanRemoval=true是告诉 hibernate 删除对不再存在的对象的引用。这对于清理依赖对象非常有用。就我而言,完成职业生涯的学生不再需要学生帐户。我希望这个答案对某人有所帮助。干杯


推荐阅读