나는 항상 주석으로 예외를 테스트했습니다.
@Test (expected = Exception.class)
public void test1() {
methodToTest() // throws an exception
}
마침내 Java 8로 전환했고 람다 표현식을 발견했습니다. 이제 원하는 결과를 얻을 수있는 또 다른 옵션이 있습니다.
@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;
}
두 번째 버전을 사용하면 단일 메서드를 더 정확하게 확인할 수 있으며 예상되는 예외를 throw 할 수있는 단일 테스트 내에서 다른 메서드에 대해 걱정할 필요가 없다는 것을 이해합니다. 또한 "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
}
어느 것이 "더 나은"것인지는 전적으로 컨텍스트에 달려 있습니다. 보편적으로 채택하지 마십시오. 주어진 상황에서 가장 명확한 테스트를 제공하는 것을 선택하십시오.
람다 중심 스타일로 비 테스트 코드를 코딩하기 시작하면 람다 중심을 사용하고 싶을 것 assertThrows()
입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다