gpt4 book ai didi

java - 我应该始终使用 Lambda 表达式进行异常测试吗?

转载 作者:行者123 更新时间:2023-12-03 18:48:20 25 4
gpt4 key购买 nike

我总是用注释测试我的异常。

@Test (expected = Exception.class)
public void test1() {
methodToTest() // throws an exception
}

我终于切换到 Java 8,并且遇到了 lambda 表达式。现在有另一个选项可以获得所需的结果。

@Test
public void test2() {
assertThrows(Exception.class, () -> methodToTest());
}

public static <X extends Throwable> Throwable assertThrows(
final Class<X> exceptionClass, final Runnable block) {
try {
block.run();
} catch(Throwable ex) {
if (exceptionClass.isInstance(ex))
return ex;
}
fail("Failed to throw expected exception");
return null;
}

我了解到,使用第二个版本,您可以更准确地检查单个方法,并且您不必担心单个测试中的其他方法也可能引发预期的异常。此外,使用“assertThrows”方法,所有测试都可以具有相同的结构,因为这都归结为对断言的调用。

除了这两点之外,是否有任何支持新方法的论点?对我来说,只要我只测试一个方法,我觉得使用注释仍然更好在单个测试中。

最佳答案

您错过了第三种方式,ExpectedException jUnit 规则:

public class SimpleExpectedExceptionTest {
@Rule
public ExpectedException thrown= ExpectedException.none();

@Test
public void myMethod_throws_no_exception_when_passed_greeting() {
fixture.myMethod("hello");
}

@Test
public void myMethod_throws_MyException_when_passed_farewell() {
thrown.expect(MyException.class);
fixture.myMethod("goodbye");
}
}

我发现这比 @Test (expected = ...) 版本更清楚,因为期望更接近方法调用。

还有普通的旧 Java 版本,我们过去常常使用它:

try {
fixture.myMethod("should throw");
fail("Expected an exception");
} catch (MyException e) {
// expected
}

众多中哪一个“更好”完全取决于上下文。不要普遍采用一个。选择在给定情况下给你最清晰测试的那个。

当您开始以 lambda 为中心的风格编写非测试代码时,您可能会发现自己想要使用以 lambda 为中心的 assertThrows()

关于java - 我应该始终使用 Lambda 表达式进行异常测试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36887698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com