【问题标题】:Is it possible to create entirely new schema on every case?是否可以在每种情况下创建全新的架构?
【发布时间】:2014-07-15 10:11:16
【问题描述】:

有没有办法在每种情况下都创建全新的架构? 这里不使用@DatabaseTearDown 注释,因为我需要重置 id 生成器作为我的一些测试期望依赖于它们(也许这是一种不好的做法)

关于重新安排我的测试的更新:

在我预期的数据集中之一:

<field oid="1" type="enumerated" name="simple enum field"
     dict_oid="1" required="0"
     level="1"/>

<field_enum_element field_oid="1"></field_enum_element>
<field_enum_element field_oid="1"></field_enum_element>
<field_enum_element field_oid="1"></field_enum_element>

其中术语表中的 oid 是生成的 id。我想确保在 field_enum_element 表中创建了 3 行,但是如果我省略了预期数据集中生成的 ID,如下所示:

<field type="enumerated" name="simple enum field"
     dict_oid="1" required="0"
     level="1"/>

<field_enum_element></field_enum_element>
<field_enum_element></field_enum_element>
<field_enum_element></field_enum_element>

spring-test-db-unit 认为表中有 0 行

更新:

  @Test
  @DatabaseSetup(value = "fieldServiceImplTest/testCreateEnumField.xml")
  @ExpectedDatabase(value = "fieldServiceImplTest/testCreateEnumField.expected.xml",
      assertionMode = DatabaseAssertionMode.NON_STRICT)
  @DatabaseTearDown(value = "fieldServiceImplTest/clear.xml", type = DELETE_ALL)
  public void testCreateEnumField() {
    FieldDTO fieldDTO = new FieldDTO();
    fieldDTO.setName("simple enum field");
    fieldDTO.setType("enumerated");
    fieldDTO.setLevel("term");
    fieldDTO.setIsValueRequired(false);
    fieldDTO.setDictionaryId(dictionaryService.findByOid(1L).get().returnIdentity());

    List<ItemDTO> itemDTOs = Arrays.asList(new ItemDTO(null, "complete"), new ItemDTO(null, "draft"), new ItemDTO(null, "deleted"));
    fieldDTO.setItems(new HashSet<>(itemDTOs));

    fieldService.createField(fieldDTO);
  }

testCreateEnumField.xml

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
  <dictionary changed="2014-01-31 18:11:54" oid="1" client_oid="1" descr="descr" name="dictionary"/>

</dataset>

testCreateEnumField.expected.xml

<?xml version="1.0" encoding="UTF-8"?>
<dataset reset_sequences="hibernate_sequence">
  <dictionary changed="2014-01-31 18:11:54" oid="1" client_oid="1" descr="descr" name="dictionary"/>
  <field client_oid="1" oid="1" type="enumerated" name="simple enum field"
         dict_oid="1" required="0"
         level="1"></field>

  <enum_element oid="11" client_oid="1" value="deleted"></enum_element>
  <enum_element oid="12" client_oid="1" value="draft"></enum_element>
  <enum_element oid="13" client_oid="1" value="complete"></enum_element>

  <field_enum_element field_oid="1"></field_enum_element>
  <field_enum_element field_oid="1"></field_enum_element>
  <field_enum_element field_oid="1"></field_enum_element>

</dataset>

理想情况下,我希望能够在测试和测试用例之间删除序列。

【问题讨论】:

  • 您能否更新您的测试以使其独立于 id 生成器的起始值,而不是在每个测试上创建一个新架构?
  • 刚刚更新了我的问题
  • 你能发布一个你的测试是什么样子的例子吗?您还需要在每次测试之前或在每个测试类之前创建架构吗?

标签: spring dbunit spring-test spring-test-dbunit


【解决方案1】:

虽然我不完全了解您的用例是什么,但听起来它非常适合尝试 Spring 4.1 RC1 中的新声明性 SQL 功能。 Here 是描述这个新功能的 JIRA 问题。

您的代码如下所示:

@Test
@Sql("fix-sequence.sql")
public void test() {
   //whatever
}

你可以找到@Sql here的Javadoc。

fix-sequence.sql 中,您将提供重置数据库所需的 SQL 以进行测试

【讨论】:

  • 谢谢,我可能会在 4.1 版本到来时使用此功能。至于现在,我想我将通过在我的测试中使用@PersistenceContext 注入并从中执行删除序列查询来获得。
  • @stanislav.chetvertkov 欢迎您!我建议你试试这个特性,因为 Spring 4.1 在 RC1 中,当发布可用时,你实际上可以将测试迁移到它。看来该功能可以为您节省大量的仪式代码。
  • 虽然它解决了问题,但它仍然是一种解决方法。理想情况下,我想给 dbunit 提示结果集中的行数。
  • 我明白你的意思。我以前没有用过 dbunit,所以我不能给你任何指示
【解决方案2】:

我可以通过使用简单的原生 sql 查询在 @Before 方法中删除序列表来解决这个问题:“drop table hibernate_sequence”。

实际上,更好的解决方案是在@DatabaseSetup 阶段将&lt;hibernate_sequence next_val="1"/&gt; 包含到测试数据集中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2014-06-16
    • 2010-10-07
    相关资源
    最近更新 更多