DbUnit:增量 id 生成问题

发布于 2024-08-20 22:46:27 字数 637 浏览 10 评论 0原文

我将 DbUnit 与 Unitils 一起使用,大多数时候效果都很好。

今天我发现一个奇怪的问题。

情况是:

  • 我使用 Hibernate,并且具有带有“增量”生成器的 id:
<id name="Id">
   <generator class="increment"/>
</id>
  • 我准备测试数据集,其中最大 id 为 5。
  • 我使用 clean-insert 加载策略。
  • 我有两个测试方法 test1test2,每个方法都在此表中添加一行。
  • test1 方法之后新添加的行的 id=6。
  • test2 方法之后,新创建的行的 id=7。

一切都很好,我明白为什么会这样。但从维护角度来看,这是一个问题。如果我在两者之间添加第三个测试方法,即使没有任何更改,方法 test2 也会突然失败,只是因为 row 将获得不同的 id。

无论如何,我可以强制 DbUnit 或 Hibernate 在每个测试方法之前计算下一个 id 值吗?

I am using DbUnit together with Unitils, which works great most of the time.

Today I found a strange problem.

Situation is:

  • I use Hibernate, and have id with "increment" generator:
<id name="Id">
   <generator class="increment"/>
</id>
  • I prepare test dataset, where maximal id is 5.
  • I use clean-insert loading strategy.
  • I have two test methods test1 and test2, each adding one row in this table.
  • After test1 method newly added row has id=6.
  • After test2 method newly created row has id=7.

This is all OK and I get why this is like that. It is a problem from maintenance perspective though. If I ever add third test method between the two, method test2 will suddenly fail even though nothing changed, just because row will get different id.

Is there anyway I can force DbUnit or Hibernate to calculate next id value before each test method?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清醇 2024-08-27 22:46:27

首先,您应该提供完整的数据集,是的,还有 id 。如果不是,请不要测试或基于 ids 进行测试。为什么不测试呢?因为它已经经过充分测试且可靠。永远记住永远不要测试第三方库,其中大多数已经经过充分测试。但不依赖 id 似乎是不可能的。我同意,你应该编写一些模拟类来为你解决这个问题,或者你可以提供一些setter方法来覆盖你自己生成的值。

第二个选项是始终以空表开始测试用例。您可以在每个测试用例之前编写一个固定装置来清理表格。

First thing, you should provide the complete dataset, yes with id as well. If not, don't test or base your test upon ids. Why not test? because its already well tested and reliable thing. Always remember never test third party libraries, most of them already well tested. But it seems quite impossible to not depending upon ids. I agree, you should write some mock class to tackle this issue for you, or may be you can provide some setter method to overwrite the value generated by your own.

Second option is always start your test case with empty table. You can write a fixture to clean the table for you, before every test case.

节枝 2024-08-27 22:46:27

解决方案不是依赖生成的 id:

  • 它们超出了测试的控制范围。
  • 如果你让它们由测试控制,你就不再测试被测类

The solution is not to rely on generated ids:

  • they are outside the control of your test.
  • if you make them controlled by the test, you are no longer testing the class-under-test
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文