假设我开发了一个扩展,该扩展不允许测试方法名称以大写字符开头。
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。 有人能告诉我我做错了什么吗?