乐趣区

关于java:两个对象

前言

这周次要是我的项目字段减少软删除,当一个我的项目的字段关系变得非常复杂时,想要删除一条数据往往因为牵扯过多数据而变得难以删除,这时就用到了咱们的软删除。软删除并不是真正的删除,而是将原有数据设置的 deleted 字段变为 true。当查问数据时,疏忽掉 deleted 字段为 true 的数据。也就是说,软删除并不是真正的删除,而是将其保留,当查问数据时,依据一个设置的 boolean 字段进行判断本条数据是否曾经删除,曾经删除的数据不再被各个性能查到。
在进行单元测试时,当在一个办法退出对软删除的测试时,断言预期后果与失常后果不统一。

两个对象?

1. 初步查看了后面进行的软删除对仓库层办法与实体的批改,并没有问题。
2. 单纯的看代码并不是无效的解决问题的形式。无效解决问题还要看执行代码过程中各字段的变动。让咱们在删除后输入一下 course 的 deleted 字段到底是什么,

System.out.println(course.isDeleted());

输入 false

当然 false 并不是咱们料想中的答案。
为了验证我先在别的已通过办法上进行试验,别离看看删除前后 deleted 字段的变动。因为如果是 delete()办法的问题,别的单元测试删除前后 deleted 字段就不会扭转。

删除前后都为 false,然而单元测试居然过了,这让我感到了奇怪。这并不合乎我的预期。带着纳闷求教了老师。老师让我在仓库层建设一个 findById(Long id)办法,通过 findById 办法从数据库找进去,而后察看 deleted 字段的值。

ourse = this.courseRepository.findByIdAndDeletedIsTrue(course.getId()).get();
System.out.println(course.isDeleted());

为什么间接输入 course 的 deleted 值是 false,而从数据库查问到的 course 的 deleted 值是 true 呢。让咱们通过 debug 来一探到底。


通过比照前后两个 course 得悉,这是两个 course 对象,也就是说,咱们在单元测试中操作的 course 和数据库中的 course 是两个 course 对象,咱们 delete 办法仅对数据库中的 course 进行了操作,所以造成了以后后果.
咱们通过代码更能阐明问题,断言两个 course 相等:

查无此人

弄清楚了这些,我该当批改我一开始的输入办法。当我尝试改过输入的 course 时,遇到了新的谬误

System.out.println(this.courseRepository.findByIdAndDeletedIsTrue(course.getId()).get().isDeleted());


大略意思就是不存在。
通过输入 id 得悉,原来我失去了一个不能用的 id.

看来是这个 id 引起的。简直同样的初始化数据操作,为什么上一个单元测试没有报错呢,通过 debug 得悉,

当们在 37 行获取一个 course 时,咱们的 course 的 id 值还是一个随便数,当咱们在 37 行保留后,咱们的保留的 course 才会有一个失常的 id 值,而两个测试的关键在于 39 行,没报错的如图所示有 course = ,而报错的并没有course = 所以 id 还是发明进去的随机值。自然而然咱们对于这个 course 进行 delete 也就杯水车薪,并不会对数据库中的 course 影响。也就产生了一开始的问题。

总结

有时候咱们设想的货色,并不一定是正确的,这就须要咱们一步步去验证,实际才是测验实践的唯一标准。

版权申明

本文作者:河北工业大学梦云智开发团队 – 赵凯强

退出移动版