【问题标题】:DBUnit, use DTD with annotation configurationDBUnit,使用带有注解配置的 DTD
【发布时间】:2014-04-24 16:30:49
【问题描述】:

我的一个 dbUnit 测试有问题,我无法解决。有一个数据结构具有由 jpa 注释定义的父子关系:

/**
 * Parent account
 */
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "parentAccountId", insertable = false, updatable = false)
private Account parentAccount;

/**
 * Subordinated accounts
 */
@OneToMany(mappedBy="parentAccount")
@JsonIgnore
private Set<Account> childAccounts = new HashSet<Account>();

我有一个抽象类,它在执行junit测试之前将数据集加载到数据库中,该类具有以下注释:

@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class })
@DatabaseSetup("classpath:db-test-script.xml")
@DatabaseTearDown(type=DatabaseOperation.DELETE_ALL, value = { "classpath:db-test-    script.xml" })

效果很好,但不适用于我之前提到的课程。数据集中的数据结构如下所示:

<referralAccount id="2" code="CODE2" />
<referralAccount id="1" code="CODE" parentAccountId="2"/>

但我在日志中发现的问题如下:

FlatXmlProducer:316 - 表 Account 的第 2 行上的额外列 (parentAccountId)(全局行号为 5)。这些列将被忽略。 请将额外的列添加到第 1 行,或使用 DTD 确保填充这些列的值或为您的 FlatXmlProducer 指定“columnSensing=true”。 有关详细信息,请参阅常见问题解答。

问题是,有没有办法通过注释来指定 dtd 或 columnSensing?如果可以避免,我不想实现 setUp 方法,因为注释似乎是处理此问题的一种简单的方法。

谢谢!

【问题讨论】:

  • DTD 应该在 XML 文件中指定,而不是在注释中。或者您可以简单地为第一行指定parentAccountId="null",如错误消息所述。或者你可以使用DbSetup
  • 您的意思是像 那样添加对它的引用,还是将其嵌入到 xml 本身中? (不确定这是否可能)

标签: java spring hibernate junit dbunit


【解决方案1】:

如果您使用的是 DBUnit 2.3.0 或更高版本,则可以使用 dbunit javadoc 中所述的 ColumnSensing 属性:

请注意,如果第一个列,DbUnit 可能会认为表丢失了某些列 该表的行具有一个或多个空值。您可以执行以下操作之一 为避免这种情况采取以下措施:

从 DBUnit 2.3.0 开始,有一个称为“列感应”的功能 它基本上将整个 XML 读入缓冲区并动态地 在新列出现时添加它们。它可以像在 下面的例子:

  // since dbunit 2.4.7
   FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
   builder.setInputSource(new File("src/xml/flatXmlTableTest.xml"));
   builder.setColumnSensing(true);
   IDataSet dataSet = builder.build();

   // or dbunit release <= 2.4.6:
   boolean enableColumnSensing = true;
   IDataSet dataSet = new FlatXmlDataSet(
            new File("src/xml/flatXmlTableTest.xml"), false, enableColumnSensing);

所以如果你使用的是spring,你可以创建一个类如:

public class ColumnDetectorXmlDataSetLoader extends FlatXmlDataSetLoader {
@Override
protected IDataSet createDataSet(Resource resource) throws Exception {
FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
builder.setColumnSensing(true);
InputStream inputStream = resource.getInputStream();
try {
return builder.build(inputStream);
} finally {
inputStream.close();
}
}
}

然后在你的junit测试中:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/spring-context.xml" })
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DbUnitTestExecutionListener.class })
@DatabaseSetup("my-dataset.xml")
@DatabaseTearDown("my-dataset.xml")
// Reference to the ColumnDetectorXmlDataSetLoader
@DbUnitConfiguration(dataSetLoader = ColumnDetectorXmlDataSetLoader.class)
public class MyTestTest {

}

在这

【讨论】:

    【解决方案2】:

    我以前也遇到过同样的问题。有3种解决方案,我应用了前者:

    1. 在您的 Flatxml 中,每一行都应包含您将要为给定表使用/测试的所有列。 (我没有找到通过注释在 spring+dbunit 中指定列感应的任何方法),在您的情况下交换行。

    2. 使用 DTD(不记得为什么我当时放弃了这个选项),您在数据集 xml 文件的开头指定了一个 DTD,即:&lt;!DOCTYPE dataset SYSTEM "dataset.dtd"&gt;(格式见下文)

      李>
    3. (头疼的方式)定义您自己的注释或摆脱注释并回退到您可以完全控制列感应等内容的经典 DbUnit/java。

    数据集 DTD 具有以下格式(示例):

    <!ELEMENT dataset (
        ACCOUNT*)>
    <!ELEMENT ACCOUNT EMPTY>
    <!ATTLIST ACCOUNT
        USER_ID CDATA #REQUIRED
        ACCOUNT_BALANCE CDATA #REQUIRED
    >
    

    【讨论】:

      【解决方案3】:

      使用 dbunit 2.5.1 版:

      InputStream inputStream = ClassNameTest.class.getResourceAsStream(name);
      assertNotNull("file " + name + " not found in classpath", inputStream);
      FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
      builder.setColumnSensing(true);
      return builder.build(inputStream);
      

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 2015-12-10
        • 2017-07-25
        • 2013-08-23
        • 1970-01-01
        • 2011-04-24
        • 2010-09-20
        • 2014-03-19
        • 2020-06-03
        相关资源
        最近更新 更多