我的要求是为一组测试完成一些初始化,并在所有测试完成后将其清除。这些测试涉及几个测试类,因为它们没有密切关系,但需要一个共同的初始化。
我正在使用@SelectClasses
来构建套件并尝试使用应该处理前后处理的自定义扩展来使用@ExtendWith
。这不起作用,我不确定JUnit中是否存在适当的解决方案。分享已经尝试过的示例代码。
套件:
@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");
}
}
输出:
test1
test2
预期输出:
beforeAll
test1
test2
afterAll
答案 0 :(得分:3)
不支持组合@RunWith
(来自JUnit 4)和@ExtendWith
(来自JUnit Jupiter):这些是来自两个不同框架的扩展机制。
从技术上讲,您的SuiteClass
是一个JUnit 4测试类。因此JUnit Jupiter不会为它注册或执行任何扩展。
关于JUnit 5中的 suites ,我们(JUnit团队)计划为不需要JUnit 4 Runner 的套件提供一流的支持(即,@RunWith(JUnitPlatform.class)
)。有关详细信息,请参阅所有GitHub issues labeled with "suites"。随意观看和/或评论任何这些问题。
在此期间,我相信最接近JUnit Jupiter实现“套件前后”支持的方法是实现一个实现BeforeAllCallback
和AfterAllCallback
的自定义扩展。该扩展需要通过在 root ExtensionContext
Store
(作为BeforeAllCallback
)中存储标记来跟踪它是否已被调用,以便它只在“套件”之前执行一次。同样,它需要计算它执行的类的数量,并在 root Store
中跟踪它。这可以用作Stack
或CountDownLatch
。作为AfterAllCallback
,扩展将需要递减全局计数器,并且只有在所有测试类完成后才执行。
您显然需要确保为属于该套件的每个测试类注册了套件扩展。也许自定义组合注释可以简化你的事情。
现在,诚然,我只是实现了,但我还没有实际编写这样的“套件”扩展。因此,如果您真正实现它,我会有兴趣了解您的体验并可能看到您的代码。 ; - )
干杯,
Sam(JUnit 5的核心提交者)