Junit assertNotNull()断言hibernate的一个小陷阱

本文讨论了在使用Hibernate DAO进行单元测试时,使用assertNotNull方法的一个潜在陷阱。当使用load方法时,即使数据库中不存在对应ID的对象,也不会立即抛出异常,而是返回一个代理对象。这种情况下,如果后续代码试图访问该对象的属性,则可能触发ObjectNotFound异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几乎所有人在断言一个对象是否为空的时候都会调用assertNotNull(obj).
但是在测试hibernateDao的方法时需要注意一下assertNotNull()这个方法.
例如:

junit 测试如下:
Info info = dao.loadById(infoId);
assertNotNull(info);

这段代码看似没什么问题.其实是有问题. load方法返回的是一个代理对象(Proxy).是实实在在的引用一个内存的对象.
assertNotNull方法只是根据 obj!=null 来判断这个断言是否为true或者false.
假如数据库当中存在id为infoId的对象.上面那个测试将不会有问题.
但是如果数据库当中不存在id为infoId的这个对象.这个测试将会隐藏一个bug.
比如在后面加上一段System.out.print(info);
你会发现如果不出现session was closed 情况时,实际上会抛出一个object not found 的异常!

小小的陷阱~.呵呵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值