junit5 给出扩展之间的依赖关系

junit5 give dependencies between extension

我刚刚开始编写一些 junit5 测试和扩展。

我很快就找到了我认为的问题:我如何告诉 junit5 ExtensionB 需要 ExtensionA 存在?

例如,我有一个 'base' 扩展 ExtensionA,它启动一个数据库并进行一些初始化,这足以进行一些测试。

我也有 ExtensionB 'requires' 由 ExtensionA 完成的一些工作,主要是从商店获取一些对象,然后解析一些参数。

显然,每当我需要分机 B 时,我也需要分机 A 存在。有没有办法强制这样做?我试过用 @ExtendWith(A.class) class ExtensionB 进行注释,但这似乎没有效果。

有什么方法可以实现我所需要的吗?

或者我只是以错误的方式使用了 junit5,应该只有一个扩展可以为我做所有事情?

Jupiter 扩展是无状态的,因此声明彼此不依赖。

想拥有A和B的特色吗?创建从 A 和 B 借用代码的扩展 C。

话虽如此,扩展可以通过扩展存储与自己和其他扩展通信:https://junit.org/junit5/docs/current/user-guide/#extensions-keeping-state

声明一个 composed annotation 以可重用的方式组合多个注释:

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith({ DatabaseExtension.class,  WebServerExtension.class })  
public @interface DatabaseAndWebServerExtension {}

扩展按声明的顺序注册。

然后您可以使用此注释代替两个单独的注释:

@DatabaseAndWebServerExtension
public class MyDbTest {}

请参阅《JUnit 5 用户指南》中关于 declarative extension registration 的部分以了解确切的语义。