问题标签 [junit5-extension-model]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
763 浏览

junit5 - 是否有一个完整的 JUnit 5 扩展示例来演示维护状态的正确方法(例如来自指南的 WebServerExtension.java)

JUnit5 手册中的主要WebServerExtension示例不完整,它没有完全展示如何正确存储配置(例如 enableSecurity、服务器 url)。

https://github.com/junit-team/junit5/blob/master/documentation/src/main/java/example/registration/WebServerExtension.java

该示例忽略或硬编码这些值。手册(第 5.11 节。在扩展中保持状态)暗示应该使用“存储”,但在构造对象时 ExtensionContext 尚不可用——不清楚如何处理将此数据作为 ExtensionContext 迁移到存储在构造函数中尚不可用。

我也不清楚是否需要为 WebServerExtension 编程示例使用 Store API,也许它可以仅使用内部状态(例如 this.serverUrl、this.enableSecurity 等)。

也许商店更适用于不使用这种“程序化”样式的扩展,其中可能存在自定义扩展的多个实例(适当地)?换句话说,我从指南中不清楚这是否是受支持的范式?

其他在线 JUnit 5 扩展示例(例如 org.junit.jupiter.engine.extension.TempDirectory)展示了如何利用注释来处理将配置信息传递给 Store,但如果有一个完整的编程构建器类型示例(如 WebServerExtension)那就太好了.

像 TempDirectory 这样的示例显然可以从 beforeXXX() 方法访问 ExtensionContext,而 WebServerExtension 示例则没有。

使用下面的方法似乎可以正常工作,但我想确认这是一个受支持的范例(即在使用这种编程方法时使用字段而不是商店)。

谢谢!

0 投票
1 回答
550 浏览

junit5 - 使用扩展的 JUnit 5 Jupiter 标签

DbExtension我所有的数据库测试都使用自定义扩展进行了注释。我还想标记这些测试,以便我可以在 CI 中单独运行它们。有什么我可以在扩展类上添加的,以便标记所有扩展测试吗?

只是为了说明(在 kotlin 中):

0 投票
1 回答
532 浏览

junit - 在本地函数中覆盖 Mockito 语句不适用于 PER CLASS 模式?

我是 JUnit5 的新手,我注意到发生了一些奇怪的事情。

让我们看一个例子,

我有一个名为 A 的源类

现在当我写测试用例时,

当我单独触发 test2() 时,printer() 函数正在打印 19,因为我认为 Mockito.when() 语句被覆盖以在 test2() 函数中返回 19,而不是在 @BeforeEach 中注册的返回 25。

当我执行类'JUnit5TestCaseForClassA'下的所有测试类时,我看到printer()函数正在为这两个测试函数打印25。压倒一切没有发生吗?或者是什么问题?

为什么会出现这种差异??????

我可以看到制作 @TestInstance(TestInstance.Lifecycle.METHOD) 将解决问题,因为每个测试用例都是用新的测试实例触发的。但我想用 Lifecycle.PER_CLASS 进行测试。

0 投票
1 回答
134 浏览

junit5 - 正在执行的 JUnit 5 测试可以注册额外的测试吗?

我想编写一个 JUnit 5 扩展,可以在执行期间注册额外的动态测试。理想情况下,这些将显示为正在执行的测试方法或类的子级。

我查看了ExecutionContext提供给扩展回调实例的内容,但它似乎没有任何钩子来允许这样做。

执行测试是否有任何其他机制可以用来注册额外的测试?

例子

从评论中,我可以看出我并不是 100% 清楚我所追求的。

@TestFactory和动态测试接近我所追求的,但并不完全在那里。它们看起来像这样:

我希望能够避免样板代码并拥有如下所示的内容:

这样,在我想到的应用程序中,我可以轻松地将动态测试改装到我现有的测试套件中,而无需进行大量重构来使用@TestFactory. 我认为如果没有额外的样板代码,代码也会更整洁、更易读。

0 投票
2 回答
949 浏览

junit5 - 如何从 TestExecutionListener 访问测试方法注释

我正在尝试将Jira JUnit 集成的测试管理移植到 JUnit5。此模块生成测试运行的 JSON 报告,并使用测试方法上的注释将结果与 Jira 票证相关联,例如

从 TestExecutionListener 我不确定检索 TestCase 注释的最佳方法是什么。

我使用 TestIdentifier.getSource 查看了反射,并进行了操作以重建方法签名并从那里提取注释,但这种方法感觉很笨拙。

我遇到了这篇文章Allow extensions to register TestExecutionListeners,它提出了以下建议:

建议:让您的扩展发布 WebDriver bean 的会话 id,例如

在您的TestExecutionListener 中,实现reportingEntryPublished 并将其存储在以TestIdentifier 作为键的Map 中。在 executionFinished 中报告测试结果以及来自此 Map 的值。

这种方法看起来很有希望,但我想确保没有另一种方法不需要扩展和测试执行侦听器。有没有办法直接在TestExecutionListener中检索测试方法注解信息?

0 投票
1 回答
1114 浏览

junit5 - 如何将自定义信息添加到 junit5 HTML 测试报告?

是否可以在 HTML 报告中添加(记录)自定义信息以在 Junit5 中通过测试?

我尝试使用来自 https://junit.org/junit5/docs/current/user-guide/#writing-tests-dependency-injection的 org.junit.jupiter.api.TestReporter

但已发布的报告条目无处可寻。生成的 HTML 报告仅包含有关名称、持续时间和测试状态的信息。

编辑:任何生成报告的标准方式对我来说都很好,只要我能够插入一些自定义数据。我尝试通过 gradle 插件和 ant task junitreport生成报告

0 投票
0 回答
133 浏览

junit5 - 如何在 BeforeAllCallback 扩展中获取所有测试方法上的所有自定义注释的列表?

什么是获取 Jupiter BeforeAllCallback 扩展中所有要执行的测试方法的所有自定义测试方法注释列表的干净方法?

扩展应从测试方法上的这些自定义注释中收集设置数据,并在任何测试方法运行之前准备集成测试。

在 Jupiter 5.4 之前,我们有一个丑陋的解决方法来通过 ClassExtensionContext 的反射检索它,设置方法“getTestDescriptor”可访问,并在其上调用 getChildren()。返回的一组 TestMethodTestDescriptors 将允许收集我们的自定义注释......

由于 Jupiter 5.4,ClassExtensionContext 是包私有的,我也必须将我的扩展移动到这个包org.junit.jupiter.engine.descriptor中,这将进一步使解决方法变得丑陋......

0 投票
1 回答
796 浏览

spring - 有没有办法在 TestExecutionListener 中获取对 Spring 应用程序上下文的引用?

我正在使用 JUnit 和 Selenium 运行端到端测试,被测应用程序经常配置错误,我希望能够在所有测试之前运行一次设置。

如何从 TestExecutionListener 中获取对测试的应用程序上下文的引用?

我使用 @SpringJUnitConfig 扩展来运行我的测试。

我需要从 TestExecutionListener 内的应用程序上下文访问 bean,以通过覆盖 testPlanExecutionStarted 来进行一些初始设置。

我想知道是否有一种方法可以访问我的测试将使用的相同 ApplicationContext 或者框架此时不知道测试应用程序上下文?

我尝试使用 SpringExtension.getApplicationContext,但无法从 TestExecutionListener 中获取对 ExtensionContext 的引用。

0 投票
2 回答
399 浏览

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

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

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

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

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

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

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

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

0 投票
0 回答
392 浏览

java - 如何基于限定符注释以编程方式自动装配 bean

在 Junit5 中,使用 Extensions 时,我们可以运行 BeforeAll 和 AfterAll 方法,我正在尝试使用 Annotations 更改测试的行为。但是,我将这些注释用作 @Qualifiers 以及 bean 初始化,并且希望能够使用测试中标识的 Annotation 来初始化 bean

我希望使用我知道SpringExtension的 Junit5的限定符注释以编程方式在运行时初始化 Bean

使用它我可以调用 bean 初始化工厂,但我不知道如何使用作为限定符的注释来初始化 bean 我有多个相同类型的 Bean,由限定符标识

我遇到的问题是

目前,我正在使用 AutoWired 静态初始化用户凭据的类型,然后基于我使用预初始化 UserCredential 的注释使用 switch case。

这个想法是有一个测试类@ExtendsWith(ResetPortal.class),然后它指示它可以使用哪种类型的用户来重置(测试前登录)。我正在使用 Qualifier Annotations 来表明这一点,然后我可以ExtensionContext从 Junit5beforeAll方法中提取它

此外,对于每种类型的用户,我都有一个UserCredential类和该类的多个 @Bean 定义。

代码

bean定义,使用自定义限定符注解User1Qualifier

我的自定义限定符如下(有多个)

现在,在测试中,我尝试使用 ResetPortal 拾取的相同注释

ResetPortal 类,由于 Junit5 初始化该类并调用它的托管实例,需要单独定义 Autowired 元素