我正在编写使用JPA进行数据库操作的java代码。即getTransaction,getResultList,setFirstResult,setMaxResults,begin,commit,flush,clear,...
我的问题是,即使我可以将我的代码包装在try catch块中,我仍然需要生成异常来测试我的代码是否有效。
如何生成数据库错误以测试异常处理?一些SQL命令在程序运行的同时在java外的DB上运行?我的目标数据库是SQL Server 2008 R2。
有关锁定和“StaleObjectStateException:Row已被其他人更新或删除...”等常见错误的示例将不胜感激。
谢谢!
答案 0 :(得分:1)
对于StaleObjectStateSession
,您可以编写像
e1 = session1.load(key);
e2 = session2.load(key);
e2.modifyAnything();
e2.update();
e2.commit();
e1.modifyAnything();
e1.update();
然后你得到你的例外。顺便说一句,StaleObjectStateSession
是一个Hibernate异常,而不是数据库异常。
为了测试真正的数据库异常,您可以违反数据库约束,例如编写一个JUnit案例,其中插入一个主键已经存在的行或者在声明为NOT NULL的列中具有空值的行数据库。
如果您只想测试一次,并且想要避免编写JUnit测试用例,那么您可以使用eclipse调试和SQL操作来完成:
在代码中加载和提交记录之间设置断点。到达断点时,在SQL中,您使用DELETE FROM table WHERE primary_key =...
手动删除此记录,并在继续执行之前提交此修改。 (或者你可以UPDATE
行,但是不要忘记更新版本列。)然后在Eclipse中继续执行程序。
另一个想法是使用ALTER TABLE table MODIFY(column ... NOT NULL)
临时使可空列不为空。测试后,您必须撤消此修改。当然,这样的测试只能在专用测试数据库上进行,而不能在生产系统上进行。
答案 1 :(得分:0)
我会模拟基于接口的DAO来创建我想要的任何异常。
您正在编写基于接口的DAO,不是吗?
我不确定尝试对可能出现的每一种特殊情况进行单元测试是否切合实际。