• 作者:老汪软件技巧
  • 发表时间:2024-12-07 07:04
  • 浏览量:

前言

Bug 记录帖:Spring Java 单元测试保存操作没执行!

起因:测试跟我说,我的接口怎么某个字段保存没成功!我说铁汁不能啊,哥们单元测试写了啊!

:然后我开始直接复现,将入参完全照搬,写入我的单元测试中,Run!好的单元测试通过,再打开数据库看一眼,好的数据没修改成功!不是哥们!裂开了啊!

开始排查

由于使用的是 Spring-Data-Jpa 控制台看 sql 还是有点麻烦,我先将断点打在了修改方法上面,里面调用了 JPA 的 save 方法,一切看起来都是那么的正常,然后我将断点往下执行,好家伙,怎么控制台的 SQL 没给我打印呢!

模拟代码如下:

questionsDao.save(questions);
控制台:鸦雀无声。。。

百度下吧!JPA 调用 save 方法失效,大多数都跟我遇到的不一样,看见了个别的方法 saveAndFlush,赶忙来试一下,诶嘿控制台打印了 SQL ,包没问题的老弟,我再一看数据库还是没更新,好好好,裂开!

模拟代码如下:

questionsDao.saveAndFlush(questions);
控制台:insert questions....

Bug 记录帖:Spring Java 单元测试保存操作没执行!_Bug 记录帖:Spring Java 单元测试保存操作没执行!_

没办法了,冷静一下先,问问 AI ‍♂️

AI 提供的思路

image-20241205155434324.png

@Transactionl 诶我这个更新方法有用到,会不会是这个问题呢,我将方法的 @Transactionl 注解移除,再来了一遍一切照旧,我裂开,还是不行,到这里还是有点迷茫了,测试说我代码有问题,我跑下来,看数据库确实没修改,我是不是真的有问题,怀疑人生,而且我还发现,我不止测试说的那个字段有问题,我是所有字段都没更新,铁汁我难受啊。

解决办法

image-20241205160104716.png

等等!所有数据没更新!事物!难道说!我急忙打开我的单元测试,在我的单元测试上面放着一个注解!@Transactional ,将这个注解注释掉!它更新成功了,而且测试说的字段也更新成功了,没有一点问题!

心机之蛙一直摸你肚子!

真相永远只有一个!分点来说:

1、save 方法控制台不打印执行 SQL,它在事物场景下不会立即更新,而是延迟更新,这就说明了刚好单元测试为什么执行的时候没看见那条 SQL。

2、使用 saveAndFlush 为什么又可以看见 SQL 呢,因为 Flush 方法会强制刷新,让它立刻执行。

3、为什么使用了上述方法,数据还是没更新呢,那是因为单元测试上面使用了 @Transactional 这个注解可以让你在跑单元测试的时候,不对数据库的数据进行影响,他跑完之后会将数据自动回滚,有时候我测试一些修改操作的时候就会使用上它!它也是我这次排查的罪魁祸首!

4、那为什么测试说我接口有字段没更新呢,我跑过去问他,跟他仔细他比对了入参,发现!他将一个参数 knowId 写成了 kowId ,字段都写错了我数据库没更新成功很正常好吧,我只想对测试小伙伴说,借我看看你的代码,我抄你的码。

经过这次排查,还是自己惹的祸,其实 Bug 并不可怕,面对 Bug 时需要冷静应对,我也是慢下来的时候才有了解决思路以及方法,希望能给予大家一些思路。

我是聪 希望可以跟大家一起学习,我的 Github:/lhccong 如果里面有你感兴趣的项目不妨给我点个星星⭐和关注,未来我还会持续写新的好玩的小项目。