0

我正在编写 java 代码来使用 JPA 进行数据库操作。即getTransaction,getResultList,setFirstResult,setMaxResults,开始,提交,刷新,清除,...

我的问题是,即使我可以将代码包装在 try catch 块中,我仍然需要生成异常的方法来测试我的代码是否有效。

您将如何生成数据库错误来测试您的异常处理?在程序运行的同时,一些 SQL 命令要在 java 之外的 DB 上运行?我的目标数据库是 SQL server 2008 R2。

将不胜感激有关锁定和“StaleObjectStateException:Row 已被另一个人更新或删除...”等常见错误的示例。

谢谢!

4

2 回答 2

1

对于StaleObjectStateSession您可以编写一个 JUnit 测试用例,例如

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)。测试后,您必须撤消此修改。当然,这样的测试只应在专用测试数据库上进行,而不应在生产系统上进行。

于 2013-04-26T09:58:12.127 回答
0

我会模拟基于接口的 DAO 来创建我想要的任何异常。

您正在编写基于接口的 DAO,不是吗?

我不确定对可能出现的每一种异常情况进行单元测试是否可行。

于 2013-04-26T01:04:56.363 回答