6

在学习了 SpringBoot 之后,我想进一步使用(DBUnit 和 SpringTestDBUnit)处理集成测试。在整个过程中,一切都很顺利,直到我遇到了为数据集上的布尔数据类型列设置值。(数据集内容如下)

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <Client code="0001" name="client_one" />
    <Client code="0002" name="client_two" />
    <Client code="0003" name="client_three" active="false" />
    <Client code="0004" name="client_four" />
</dataset>

active="false"属性添加到客户端记录 [code=0003],我的集成测试失败并向我显示这条消息,该消息Exception processing table name='Client'导致客户端记录 [code=0001] 违反了活动的非空列约束。

通过为所有记录上的活动列提供值(这有点偏离规范)来修复错误(在分支DBUnit_For_Boolean_Columns_Attempt_One上)后,它起作用了。但是我的目标能够使用上面编写的数据集成功运行集成测试。

问题是如何使用上面的数据集成功进行集成测试?到目前为止,我很难实施解决方案,因此我创建了一个Bitbucket 存储库供您查看和帮助。


变更日志

  • 2015/02/04 变化

    1. 改进问题内容
    2. 添加了 Bitbucket 存储库
4

1 回答 1

1

(我在这里有一个不同的答案,这是对问题的完全误诊,因为我错过了 OP 正在使用的事实FlatXmlDataSet)。

来自FlatXmlDataSet的文档:

默认情况下,从每个表的第一行推导出表元数据。请注意,如果该表的第一行有一个或多个null值,DbUnit 可能会认为该表缺少某些列。

这似乎是这里的问题,因为第一个条目没有为active. 为避免此问题,您可以使用 DBUnit 的列感知属性,这实质上使 DBUnit 在推断表的结构之前读取整个 XML:

FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
builder.setInputSource(new File("path/to/dataSet.xml"));
builder.setColumnSensing(true); // HERE!
IDataSet dataSet = builder.build();

或者,如果您不是自己创建构建器并且不想操作它,只需确保active在每个元素中都有该列,尤其是第一个元素:

<dataset>
    <client code="0001" name="client_one" active="false" />
    <client code="0002" name="client_two" active="true" />
</dataset>
于 2015-01-26T07:09:18.790 回答