如何在不修改原始数据库的情况下使用 javadb 对 jpa 代码进行 JUnit 测试?

Posted

技术标签:

【中文标题】如何在不修改原始数据库的情况下使用 javadb 对 jpa 代码进行 JUnit 测试?【英文标题】:How to JUnit test the jpa-code using javadb without modifying the original db? 【发布时间】:2016-05-15 16:30:34 【问题描述】:

我正在使用 JPA 将我的 java 对象存储在使用 javadb 的数据库中。

现在我已经编写了 JUnit 测试来检查对象是否从 javadb 中正确存储和删除等。

问题在于,在之前的测试中对数据库的修改会影响以后的测试,更重要的是,显然会修改我用于我的应用程序的数据库。

我发现的一个解决方案是为每个测试反转事务,但由于我正在测试的几种方法已经提交了它们的事务,我认为这对我不起作用。

我还考虑通过将所有数据存储在文件中并在之后恢复数据库来创建备份,或者使用不同的 jdbc.url 值创建创建的 persistence.xml(在我运行测试时会以某种方式使用)而不是原来的)并创建一个单独的数据库。

但我不知道如何使这些解决方案发挥作用,或者它们是否是好的解决方案。

那么任何人都可以向我解释如何在运行这些测试时准确地避免修改原始数据库吗?

【问题讨论】:

是否对被测代码进行修改以使该代码无法提交?这将允许测试决定是提交还是回滚。 我建议有一个单独的测试数据库。您可以使用 DBUnit 之类的东西为每个测试填充相关数据。 dbunit.sourceforge.net 可能是没有其他方法可以实现这一点,但我实际上正在测试一个抽象(由此类实现的接口),并且真的不希望改变方法的作用。跨度> 【参考方案1】:

我最终只使用了带有单独的 persistence.xml 的 maven,它配置了一个不同的 javadb 数据库,纯粹用于运行测试,如 here 所述。

由于时间限制,我没有按照Alan Hay's comment 的建议使用 DBUnit,但这似乎也是一个有效的选择。

【讨论】:

以上是关于如何在不修改原始数据库的情况下使用 javadb 对 jpa 代码进行 JUnit 测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改修改后的时间戳的情况下签入文件?

如何在不保存原始图像的情况下保存图像 URL 的裁剪图像? (在 Rails 中使用 Paperclip 或其他插件)

如何编写一个函数,在不使用返回的情况下更改原始整数列表?

使用 Python - 如何在不超过原始图像大小的情况下调整裁剪图像的大小以满足纵横比

如何在不更改原始列表的情况下更改新列表?

如何在不重定向原始 URL 的情况下获取短 URL 服务的信息或实际信息