从main方法内部启动JUnit jupiter测试?

时间:2018-05-01 02:54:23

标签: junit junit5

我有一个带有main方法的Java类,我调用它偶尔会运行一些测试。具体来说,我正在尝试提出一种解决方案,用于快速测试使用AWS SDK创建/读取某些S3对象的各种代码片段。我并不是真的想要构建常规的单元/集成测试,而且我对模拟S3代码不感兴趣。我正在尝试使用测试框架快速开发/调试一些代码。我发现了以下SO问题,以及关于使用JUnit5 Jupiter的Launcher的答案,它引起了我的兴趣: How do I run JUnit tests from inside my java application? 因此,我在Launcher API上阅读the Junit5 chapter并按照示例代码进行操作。我想出了类似的东西:

class S3ManualTest {
    public static void main(String[] args) {
        LauncherDiscoveryRequest request =
            LauncherDiscoveryRequestBuilder
                .request()
                .selectors(selectPackage("com.xyz.s3util"),
                           selectClass(S3ManualTest.class),
                           selectMethod(S3ManualTest.class, "happyPath")
                )
                .build();

        Launcher launcher = LauncherFactory.create();
        SummaryGeneratingListener listener = new SummaryGeneratingListener();

        launcher.execute(request, listener);

        TestExecutionSummary summary = listener.getSummary();
        System.out.println("# of containers found: " + summary.getContainersFoundCount());
        System.out.println("# of containers skipped: " + summary.getContainersSkippedCount());
        System.out.println("# of tests found: " + summary.getTestsFoundCount());
        System.out.println("# of tests skipped: " + summary.getTestsSkippedCount());
    }

    void happyPath() {
        assertTrue(true); // Do useful stuff here
    }
}

即使我特意选择了“happyPath”方法,启动程序也找不到任何要运行的测试。我尝试使用happyPath()注释@Test方法,这似乎有效,但是如果我在gradle中运行该包中的所有测试,它也会产生不希望的副作用。或者从IDE内部。本质上,我希望使用JUnit5框架调用我的测试方法,但只有当我在类中手动运行main方法时。我正在考虑一些自定义注释,或者实现一些可以被测试引擎拾取的接口,但还没有走下去。我猜有一些简单的方法可以完成我想要做的事情。谢谢。

1 个答案:

答案 0 :(得分:2)

我只能找到解决方法:默认情况下禁用happyPath()测试方法并在您的程序中覆盖它,如下所述:https://junit.org/junit5/docs/current/user-guide/#extensions-conditions-deactivation

@Test
@Disabled
void happyPath() {
    assertTrue(true); // Do useful stuff here
}

在启动器设置中,停用DisabledCondition

LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder
            .request()
            .selectors(selectMethod(S3ManualTest.class, "happyPath"))
            .configurationParameter(
                 "junit.jupiter.conditions.deactivate",
                 "org.junit.*DisabledCondition")
            .build();

如果您不想在整个运行期间停用DisabledCondition,也可以指定专用开关:

@Test
@EnabledIf("'true'.equals(junitConfigurationParameter.get('manual'))")
void happyPath() {
    assertTrue(true); // Do useful stuff here
}

LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder
        ...
        .configurationParameter("manual", "true")
        .build();

第二种解决方法,如果应用于多种方法,则会为专用ExecutionCondition扩展而尖叫。详见https://junit.org/junit5/docs/current/user-guide/#writing-tests-conditional-execution-scripts