Mongock在集成测试中执行一系列变化单元



>问题:如何在集成测试中执行一定范围的更改单元?

问题示例:我有三个更改单元:XYZ(order设置为:123)。我有T1XYZT2的集成测试。如何在测试T1中仅执行XY迁移(并"跳过"Z)?

我的解决方案:我只看到两种方式。

假设每个测试都有自己的运行器(就像我们在MongockIntegrationTestBase#mongockBeforeEach中所做的那样):

  1. 每个迁移文件(或一组文件)应放在一个包中。并且运行器将addMigrationScanPackage指定(将测试范围缩小到仅在该包中找到的那些迁移)。在这种情况下,我们将使用迁移XY打包P1,并使用Z打包P2,因此它将是:

    runnerBuilder.addMigrationScanPackage("P1");
    return runnerBuilder.buildRunner();
    
  2. 代替包,我们将使用ChangeUnit#systemVersion并执行具有属性的 run:SystemVersionable#setStartSystemVersionSystemVersionable#setEndSystemVersion。在这种情况下,我们将在XYZsystemVersion设置为123并在运行测试之前T1我们将得到:

    runnerBuilder.setStartSystemVersion("1");
    runnerBuilder.setEndSystemVersion("2");
    return runnerBuilder.buildRunner();
    

这两种解决方案对我来说都不令人满意。

  1. 第一个看起来很奇怪,为每个迁移文件创建一个单独的包
  2. 第二个稍微好一点,但是:
  • SystemVersion并非用于此目的
  • 订购ChangeUnit#order必须与ChangeUnit#systemVersion并行,这不是一个好方法

还有其他方法可以解决这个问题吗?

这是一个奇怪的情况,因为您要么想运行整个迁移,要么只想在一个更改单元中执行单元测试,您只需运行带有@Execution注释的方法即可完成。

但是,实现此目的的解决方法类似于您的第一个解决方案。创建自己的运行器,但您可以直接传递类列表,而不是传递包,addMigrationClasses(List<Class<?>> classes)addMigrationClass(Class<?> clazz)

最新更新