3

TL;DR 有什么方法可以用扩展注释一个完整的类,同时能够拦截所有测试并多次调用它们?

我们正在尝试将我们的一个项目从 Junit4 更新到 Junit5(在此处找到链接),但是我们在从使用规则、运行器和语句到使用 JUnit5 扩展的等价物的迁移过程中遇到了一些问题。

该项目对 SQL 语句执行变异测试,其中每个测试方法运行多次,针对 SQL 的每个可能的变异执行一次,以生成 SQL 的代码覆盖率报告。目前我们使用 JUnit4 规则执行此操作,但我们希望更改此规则以支持 JUnit 5,因此需要将此规则更改为扩展。目前在 Rule 中的工作方式是,当调用 (@Test) 方法时,它会依次调用 Rule 的 apply() 方法,然后我们使用它返回自定义 Statement 对象。在此语句中,我们创建突变体,然后多次调用基本评估()方法,每个突变体一次,并监控和存储结果。

我们尝试研究如何在 JUnit5 中通过扩展实现等效功能,但 Repeated 和 Paramaterized 提供的类似功能(它们都多次运行方法)需要为它们应用的每个方法添加注释。我们宁愿使用 @ExtendWith 然后能够拦截所有测试方法调用并将我们的多个调用功能注入所有这些。我们研究了 @Repeated 和 @Paramterized 如何通过 TestTemplate 注释和“TestTemplateInvocationContextProvider”来做到这一点,但是在方法级别添加注释是我们想要避免的,因为通常用户想要基于整个类而不是单个方法的覆盖率报告. 我们还查看了扩展可以实现的各种 JUnit5 生命周期接口,例如 InvocationInterceptor,但这仅允许我们在被调用的方法上调用一次proceed() ,而我们需要多次执行此操作。

有什么方法可以用扩展注释一个完整的类,同时能够拦截测试并对其进行更改?

非常感谢您的参与!

4

0 回答 0