gpt4 book ai didi

java - 更改 Unitils DbUnitModule 的 TestListener

转载 作者:太空宇宙 更新时间:2023-11-04 08:09:28 24 4
gpt4 key购买 nike

我正在尝试使用 Unitils 来帮助我进行数据库测试。我想使用 Unitils/DBMaintain 功能来禁用约束。然而,这存在一些问题。我不想使用 DBMaintain 为我创建数据库,但我希望使用其约束禁用功能。我能够通过使用下面列出的自定义模块来实现这一目标:

public class DisableConstraintModule implements Module {

private boolean disableConstraints = false;

public void afterInit() {
if (disableConstraints) {
DatabaseUnitils.disableConstraints();
}
}

public void init(Properties configuration) {
disableConstraints = PropertyUtils.getBoolean("Database.disableConstraints", false, configuration);
}
}

这部分解决了我想要的问题,但是我希望能够仅禁用我将在测试中使用的表的约束。我的测试将针对具有多个模式的数据库运行,每个模式都有数百个不同的表。 DatabaseUnitils.disableConstraints() 禁用每个模式中每个表的约束,这将非常耗时并且没有必要。

在搜索 dbmaintain 代码时,我发现 Db2Database 类确实包含一个用于禁用特定模式和表名基础上的约束的函数,但是此方法受到保护。我可以通过扩展 Db2Database 类或使用反射来访问它。

接下来,我需要能够确定我感兴趣的架构和表。我可以通过观察 @DataSet 注释来根据 xml 中的内容确定哪些架构和表很重要。为了做到这一点,我需要重写 TestListener,以便我可以指示它在尝试插入数据集之前使用 xml 禁用约束。这是我的尝试:

public class DisableConstraintModule extends DbUnitModule {

private boolean disableConstraints = false;

private TableBasedConstraintsDisabler disabler;

public void afterInit() {
}

public void init(Properties configuration) {
disableConstraints = PropertyUtils.getBoolean("Database.disableConstraints", false, configuration);

PropertyUtils.getInstance("org.unitils.dbmaintainer.structure.ConstraintsDisabler.implClassName", configuration);
}

public void disableConstraintsForDataSet(MultiSchemaDataSet dataSet) {
disabler.disableConstraints(dataSet);
}


protected class DbUnitCustomListener extends DbUnitModule.DbUnitListener {

@Override
public void beforeTestSetUp(Object testObject, Method testMethod) {
disableConstraintsForDataSet(getDataSet(testMethod, testObject));
insertDataSet(testMethod, testObject);
}
}

}

这就是我想要做的,但是我无法获取 @DataSet 注释来触发我的 DbUnitCustomListener,而是调用默认的 DBUnitModule DbUnitListener。无论如何,我是否可以在使用 @DataSet 注释时覆盖调用哪个监听器,或者是否有更好的方法来禁用 DB2 数据库的特定模式和表级别的约束?

谢谢

最佳答案

您必须告诉 Unitils 使用 DbUnitModule 的子类。您可以使用unitils.properties 文件中的unitils.module.dbunit.className 属性来执行此操作。听起来您已经弄清楚了这一部分。

第二部分是重写 DbUnitModule 的 getTestListener() 以返回自定义监听器。

查看此post举个例子。

关于java - 更改 Unitils DbUnitModule 的 TestListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11473055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com