我的要求是为一组测试完成一些初始化,并在所有测试完成后将其清除。这些测试涉及一些测试类,因为它们并不密切相关,但需要共同的初始化。
我在用@SelectClasses
形成套件并尝试利用@ExtendWith
使用应该处理预处理和后处理的自定义扩展。这不起作用,我不确定 JUnit 中是否存在适当的解决方案。分享已经尝试过的示例代码。
Suite:
@SelectClasses({FirstTest.class, SecondTest.class})
@ExtendWith(SuiteExtension.class)
@RunWith(JUnitPlatform.class)
@SuiteDisplayName("test suite")
public class SuiteClass {
}
扩大:
public class SuiteExtension implements BeforeAllCallback, AfterAllCallback {
@Override
public void afterAll(ExtensionContext context) throws Exception {
System.out.println("afterAll");
}
@Override
public void beforeAll(ExtensionContext context) throws Exception {
System.out.println("beforeAll");
}
}
测试1级:
public class FirstTest {
@Test
void test1(){
System.out.println("test1");
}
}
测试2级:
public class SecondTest {
@Test
void test2(){
System.out.println("test2");
}
}
Output:
test1
test2
预期输出:
beforeAll
test1
test2
afterAll
组合@RunWith
(来自 JUnit 4)和@ExtendWith
(来自 JUnit Jupiter)不受支持:这些是来自两个不同框架的扩展机制。
从技术上来说,你的SuiteClass
是 JUnit 4 测试类。因此,JUnit Jupiter 不会为其注册或执行任何扩展。
关于suites在 JUnit 5 中,我们(JUnit 团队)计划为不需要 JUnit 4 的套件提供一流的支持Runner (i.e., @RunWith(JUnitPlatform.class)
)。查看全部标有“套件”的 GitHub 问题 https://github.com/junit-team/junit5/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22theme%3A%20suites%22了解详情。请随意观看和/或评论任何这些问题。
在此期间,我相信在 JUnit Jupiter 中实现“套件前后”支持最接近的方法是实现一个自定义扩展,该扩展实现BeforeAllCallback
and AfterAllCallback
。该扩展需要通过在root ExtensionContext
Store
(as a BeforeAllCallback
),这样它只执行once在“套房”之前。类似地,它需要计算它所执行的类的数量并在root Store
。这将作为Stack
or CountDownLatch
. As an AfterAllCallback
,扩展需要减少全局计数器并且仅execute所有测试课程完成后。
显然,您需要确保为属于该套件的每个测试类注册您的套件扩展。也许自定义组合注释可以简化您的问题。
现在,不可否认,我只是实施的在我的脑海中,但尚未实际编写这样的“套件”扩展。因此,如果您实际实现它,我有兴趣了解您的经验并可能看到您的代码。 ;-)
Cheers,
Sam(JUnit 5 的核心提交者)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)