当前位置: 首页 > 面试题库 >

检查JUnit Extension抛出特定的异常

宰父宾实
2023-03-14
问题内容

假设我开发了一个扩展,该扩展不允许测试方法名称以大写字符开头。

public class DisallowUppercaseLetterAtBeginning implements BeforeEachCallback {

    @Override
    public void beforeEach(ExtensionContext context) {
        char c = context.getRequiredTestMethod().getName().charAt(0);
        if (Character.isUpperCase(c)) {
            throw new RuntimeException("test method names should start with lowercase.");
        }
    }
}

现在,我要测试我的扩展程序是否按预期工作。

@ExtendWith(DisallowUppercaseLetterAtBeginning.class)
class MyTest {

    @Test
    void validTest() {
    }

    @Test
    void TestShouldNotBeCalled() {
        fail("test should have failed before");
    }
}

如何编写测试以验证尝试执行第二种方法是否抛出带有特定消息的RuntimeException?


问题答案:

在尝试了答案中的解决方案和注释中链接的问题之后,我最终使用了JUnit Platform Launcher解决方案。

class DisallowUppercaseLetterAtBeginningTest {

    @Test
    void should_succeed_if_method_name_starts_with_lower_case() {
        TestExecutionSummary summary = runTestMethod(MyTest.class, "validTest");

        assertThat(summary.getTestsSucceededCount()).isEqualTo(1);
    }

    @Test
    void should_fail_if_method_name_starts_with_upper_case() {
        TestExecutionSummary summary = runTestMethod(MyTest.class, "InvalidTest");

        assertThat(summary.getTestsFailedCount()).isEqualTo(1);
        assertThat(summary.getFailures().get(0).getException())
                .isInstanceOf(RuntimeException.class)
                .hasMessage("test method names should start with lowercase.");
    }

    private TestExecutionSummary runTestMethod(Class<?> testClass, String methodName) {
        SummaryGeneratingListener listener = new SummaryGeneratingListener();

        LauncherDiscoveryRequest request = request().selectors(selectMethod(testClass, methodName)).build();
        LauncherFactory.create().execute(request, listener);

        return listener.getSummary();
    }

    @ExtendWith(DisallowUppercaseLetterAtBeginning.class)
    static class MyTest {

        @Test
        void validTest() {
        }

        @Test
        void InvalidTest() {
            fail("test should have failed before");
        }
    }
}

JUnit本身不会运行,MyTest因为它是不带的内部类@Nested。因此,在构建过程中不会有失败的测试。

更新资料

JUnit本身不会运行,MyTest因为它是不带的内部类@Nested。因此,在构建过程中不会有失败的测试。

这不是完全正确的。JUnit本身也将运行MyTest,例如,如果在IDE或Gradle构建中启动了“运行所有测试”。

MyTest未执行的原因是因为我使用了Maven并使用进行了测试mvn test。Maven使用Maven
Surefire插件执行测试。该插件具有默认配置,该配置 排除 所有嵌套类,例如MyTest



 类似资料:
  • 问题内容: 包含多个有关将检查的异常与混合使用的问题。 虽然一些答案暗示使用其方法会导致难以阅读的用户代码。 我将使用此空间来提供可提高可读性的替代解决方案。 请注意,此问题特定于CompletableFuture。 这使我们能够提供更广泛地不扩展到lambda表达式的解决方案。 问题答案: 给定实用程序类(下面提供),用户可以无缝地抛出检查异常: 由lambda引发的任何异常(是否经过检查)都将

  • 假设我想在收到特定异常时恢复某个值,否则返回失败的未来。我希望是这样的: 如果函数会抛出检查过的异常,我想在链式方法中处理它。我尝试过和,但都无法编译。是否为这种情况提供了任何解决方案?我知道接口是方法的参数,它不会抛出任何异常——在这种情况下,我只想返回已经失败的未来。我想找到使用Java8的解决方案。

  • 如何从Java 8流/lambda内部抛出检查异常? 换句话说,我想让像这样的代码编译: 此代码未编译,因为上面的方法抛出了,而该方法已被选中。 请注意,我不想在运行时异常中包装已检查的异常,而抛出包装的未检查的异常。我想抛出检查的异常本身,并且不向流中添加丑陋的/。

  • 我怎样才能用Java8做到这一点呢?

  • 根据JCIP第6.3.2节: Runnable是一个相当有限的抽象;run无法返回值或引发选中的异常。 无法返回值,因为其返回类型为void,但为什么不能引发选中的异常?

  • 我试图在lambda内部抛出一个异常,但它总是给我一个错误,表示未处理的IOException。 有人能告诉我我做错了什么吗?