【问题标题】:How to check in Play Framework if a unit test performed a database insert/update/delete如果单元测试执行了数据库插入/更新/删除,如何检查 Play Framework
【发布时间】:2015-11-05 11:19:07
【问题描述】:

我有一个基类,我的所有控制器测试都扩展了它。这是这样设置的,因此每个单元测试都可以有自己的 Fixture 来加载。

所以@Before 覆盖将检查测试所需的夹具是什么,加载它然后开始测试。

这里的问题是每次都会重新加载夹具。即使该方法只对数据库进行了选择,也没有任何改变。

Play 框架使用的内存数据库是 H2 数据库。我想知道是否有办法在单元测试完成后检查数据库是否发生了变化,如果没有,则跳过重新加载完全相同的数据。

我试过identity_scope,无论如何它都返回null。

【问题讨论】:

  • 我不知道是否有可能仅使用 Junit 来实现它,但有一个工具可以让您轻松管理此加载。它的 dbunit,您可以轻松地在游戏中使用它。据我所知,Junit 的主要目的是将测试彼此分开。但我并不是说这是不可能的也许你可以尝试使用 @BeforeClass 并结合测试套件。
  • 我查了一下,看来我必须为此重构所有现有的单元测试。感谢您的建议,但我不能花时间。
  • 您是否考虑过从内存数据库更改为实际的物理数据库?

标签: unit-testing playframework h2 playframework-2.2


【解决方案1】:

H2 无法检查上次应用更改的时间。 但是,您可以只创建一个额外的列,以节省上次修改时间

CREATE TABLE TEST(ID INT, NAME VARCHAR, LAST_MOD TIMESTAMP AS NOW());

这样你可以保存一个测试开始的时间,然后在测试开始时间之后查询数据库是否有任何修改日期。

我没有看到任何其他可能的方式

【讨论】:

  • 嗯,我猜这是最好的主意,但我会花很多时间来确保这些列仅在单元测试运行时才存在,并在插入发生时自动填充。这提醒了我:删除呢?如何跟踪已发生的删除?
  • 通过我发布的查询,它会自动将时间戳更改为任何修改的实际时间,因为每次记录更改时都会执行 AS NOW()。在测试中创建额外的字段不是一个好主意,但我想说额外的列不会对整个程序产生很大的影响。即使只是为了测试目的
  • 好的。但是在一个测试中删除一行然后期望它在下一个测试中出现呢?而且,这只有在我知道要测试什么表的情况下才有效。我真正需要的是一种方法来检测整个数据库中的任何表是否已被更改。
  • 好吧,我想这是不可能的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多