>问题:如何在集成测试中执行一定范围的更改单元?
问题示例:我有三个更改单元:X
、Y
、Z
(order
设置为:1
、2
、3
)。我有T1
X
、Y
和Z
T2
的集成测试。如何在测试T1
中仅执行X
和Y
迁移(并"跳过"Z
)?
我的解决方案:我只看到两种方式。
假设每个测试都有自己的运行器(就像我们在MongockIntegrationTestBase#mongockBeforeEach
中所做的那样):
-
每个迁移文件(或一组文件)应放在一个包中。并且运行器将
addMigrationScanPackage
指定(将测试范围缩小到仅在该包中找到的那些迁移)。在这种情况下,我们将使用迁移X
和Y
打包P1
,并使用Z
打包P2
,因此它将是:runnerBuilder.addMigrationScanPackage("P1"); return runnerBuilder.buildRunner();
-
代替包,我们将使用
ChangeUnit#systemVersion
并执行具有属性的 run:SystemVersionable#setStartSystemVersion
和SystemVersionable#setEndSystemVersion
。在这种情况下,我们将在X
、Y
、Z
systemVersion
设置为1
、2
、3
并在运行测试之前T1
我们将得到:runnerBuilder.setStartSystemVersion("1"); runnerBuilder.setEndSystemVersion("2"); return runnerBuilder.buildRunner();
这两种解决方案对我来说都不令人满意。
- 第一个看起来很奇怪,为每个迁移文件创建一个单独的包
- 第二个稍微好一点,但是:
SystemVersion
并非用于此目的- 订购
ChangeUnit#order
必须与ChangeUnit#systemVersion
并行,这不是一个好方法
还有其他方法可以解决这个问题吗?
这是一个奇怪的情况,因为您要么想运行整个迁移,要么只想在一个更改单元中执行单元测试,您只需运行带有@Execution
注释的方法即可完成。
但是,实现此目的的解决方法类似于您的第一个解决方案。创建自己的运行器,但您可以直接传递类列表,而不是传递包,addMigrationClasses(List<Class<?>> classes)
或addMigrationClass(Class<?> clazz)