6

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

我很快就遇到了我认为的问题:我如何告诉 junit5ExtensionB需要ExtensionA在场?

例如,我有一个“基础”扩展ExtensionA,它启动一个数据库并进行一些初始化,这对于一些测试来说已经足够了。

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

显然,每当我想要扩展 BI 时,也需要扩展 A 存在。有办法强制吗?我试过用@ExtendWith(A.class)类注释,ExtensionB但这似乎没有效果。

有没有办法实现我所需要的?

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

4

2 回答 2

1

声明一个组合注解,以可重用的方式组合多个注解:

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

扩展按照声明的顺序注册。

然后,您可以使用此注释而不是两个单独的注释:

@DatabaseAndWebServerExtension
public class MyDbTest {}

有关确切语义,请参阅 JUnit 5 用户指南中有关声明性扩展注册的部分。

于 2022-01-19T10:38:55.740 回答
0

Jupiter 扩展意味着是无状态的,因此声明彼此之间没有依赖关系。

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

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

于 2019-11-14T14:31:48.437 回答