3

我的要求是对一组测试进行一些初始化,并在所有测试完成后将其清除。这些测试在一些测试类上旋转,因为它们并不密切相关,但需要一个共同的初始化。

@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
4

1 回答 1

5

不支持组合@RunWith(来自 JUnit 4)和@ExtendWith(来自 JUnit Jupiter):它们是来自两个不同框架的扩展机制。

从技术上讲,您SuiteClass是一个 JUnit 4 测试类。因此 JUnit Jupiter 不会为其注册或执行任何扩展。

关于 JUnit 5 中的套件,我们(JUnit 团队)计划为不需要 JUnit 4 Runner(即@RunWith(JUnitPlatform.class))的套件提供一流的支持。有关详细信息,请参阅所有标有“套件”的 GitHub 问题。随意观看和/或评论任何这些问题。

在此期间,我相信最接近在 JUnit Jupiter 中实现“前后套件”支持的方法是实现一个自定义扩展,该扩展实现BeforeAllCallbackAfterAllCallback. 该扩展需要通过在 ExtensionContext Store中存储一个标志(作为 a BeforeAllCallback)来跟踪它是否已经被调用,以便它只在“套件”之前执行一次。同样,它需要计算它执行的类的数量并在root Store中跟踪它。这将用作Stackor CountDownLatch。作为一个AfterAllCallback,扩展需要减少全局计数器,并且只有在所有测试类完成后才执行。

您显然需要确保为属于该套件的每个测试类注册您的套件扩展。也许自定义组合注释会为您简化问题。

现在,诚然,我只是在脑海中实现了这一点,但还没有真正编写过这样的“套件”扩展。因此,如果您实际实施它,我很想听听您的经验并可能查看您的代码。;-)

干杯,

Sam(JUnit 5 的核心提交者)

于 2018-05-28T11:12:44.023 回答