bla*_*gae 6 java mysql testng dbunit jpa
我正在询问并回答这个问题以供将来参考,因为我认为我找到了一个解决DbUnit常见问题的合适解决方案.我希望它能帮到某个人,某个地方.
我正在使用DbUnit 2.5.0和TestNG 6.8.8.我的用例是包含3个实体的数据库的一部分.有一个ServiceUser持有a Administrable和a 的外键UserGroup.
我按照http://city81.blogspot.com/2011/03/testing-jpa-entities-using-dbunit.html上的大部分代码示例进行了操作.
public abstract class AbstractDatabaseTest {
protected EntityManager em; // initialized elsewhere
private IDatabaseConnection connection;
private IDataSet dataset;
@BeforeClass
private void setupDatabaseResource() throws Exception {
// using Hibernate
connection = new DatabaseConnection(((SessionImpl) (em.getDelegate())).connection());
connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());
// full database export
IDataSet fullDataSet = connection.createDataSet();
final String datasetPath = String.format("%s%s", RESOURCE_FOLDER, "Testing.xml");
FlatXmlDataSet.write(fullDataSet, new FileOutputStream(datasetPath));
FlatXmlDataSetBuilder flatXmlDataSetBuilder = new FlatXmlDataSetBuilder();
flatXmlDataSetBuilder.setColumnSensing(true);
dataset = flatXmlDataSetBuilder.build(new FileInputStream(datasetPath));
}
@AfterMethod
public void cleanDB() throws Exception {
em.getTransaction().begin();
DatabaseOperation.CLEAN_INSERT.execute(connection, dataset);
em.getTransaction().commit();
}
}
Run Code Online (Sandbox Code Playgroud)
结果如下XMLDataSet(数据省略):
<dataset>
<administrable/>
<serviceuser/>
<usergroup/>
</dataset>
Run Code Online (Sandbox Code Playgroud)
当TestNG执行@AfterMethod,我得到以下异常:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
Cannot delete or update a parent row: a foreign key constraint fails (`testing_db`.`serviceuser`, CONSTRAINT `FK_gyylcfbhpl2ukqs5rm7sq0uy8` FOREIGN KEY (`userGroup_id`) REFERENCES `usergroup` (`id`))
Run Code Online (Sandbox Code Playgroud)
bla*_*gae 12
问题是XMLDataSet上面创建的我不知道表中的外键约束,并按字母顺序创建表列表.CLEAN_INSERT但是,该操作采用表的列表并以相反的顺序遍历它,并且它要求ServiceUser.userGroup_id在引用的实体(此处为:)之前删除外键引用(此处:) UserGroup.
我通过Unitils发现这些信息不起作用,并且http://forum.spring.io/forum/spring-projects/data/12868-dbunit-test-fails-mysql-server-hates-me?p=337672#post337672
对DbUnit文档的一些细微挖掘导致了一种创建数据集的更正方法,该方法检查外键依赖关系并尝试正确地对实体进行排序:
IDataSet fullDataSet = new FilteredDataSet(new DatabaseSequenceFilter(connection), connection.createDataSet());
Run Code Online (Sandbox Code Playgroud)
结果:
<dataset>
<administrable/>
<usergroup/>
<serviceuser/>
</dataset>
Run Code Online (Sandbox Code Playgroud)
这将是CLEAN_INSERT正确的.
免责声明:我没有遇到循环依赖或自引用外键,我还没有测试过这个修复可以处理它们.
| 归档时间: |
|
| 查看次数: |
7568 次 |
| 最近记录: |