[JUnit5] Assertion 메소드(assertTrue, assertEquals, assertAll 등)
- Testing/JUnit
- 2020. 6. 11. 20:11
JUnit5 Assertion 기본 메소드 종류
1. assertTrue, assertFalse (boolean condition, String message)
- argument로 특정 조건 및 boolean 값을 넘기고 assertTrue인 경우 false일때, assertFalse인경우 true일때, junit 에러를 발생시키며 message를 메시지로 리턴한다.
2. assertNotNull, assertNull (Object object, String message)
- argument로 객체를 넘기면 객체가 null 일경우와 not null 일 경우 예외 메시지로 message를 리턴하게 된다. 위의 두가지 메소드와 엇비슷한 용도로 사용된다.
* 위의 메소드처럼 assertXXX로 시작하는 메소드들 : assertEquals, assertNotEquals, assertSame, assertArrayEquals
이 메소드들의 공통점은 해당 라인에서 assert에 해당하지 않는 Exception이 발생할 경우 그 즉시 모든 Test를 멈추고 에러메시지를 띄우고 Test는 중단된다.
즉, 다음의 경우 B Case는 실행되지 않는다는 것이다.
@Test
void test1() {
//A Case
assertFalse(true, "Exception!!!");
//B Case
TestObject tObj = null;
assertNotNull(tObj, "Object is Null!!");
}
결과:
A Case의 에러메시지만 출력되는 것을 볼 수 있습니다. A Case에서 에러가 발생하는 순간 모든 테스트를 멈추었기 때문입니다.
이러한 경우 B Case는 A Case가 통과되기 전에는 실행할 수 없습니다. 하지만 만약 A, B Case 가 각각 독립적이지만 연관된 테스트인 경우 동시에 테스트할 필요가 있습니다. 왜냐하면 A와 B 모두 한번에 테스트되어야 수정이 가능할테니까요. 일을 두번할 필요는 없다고 생각합니다.
assertAll 메소드
위에서 언급한 문제의 해결은 AssertAll 메소드로 해결할 수 있습니다. 이름만 봐도 알겠지만 assert류의 모든 실행을 책임지는 메소드입니다.
assertAll(Executable... executables);
- Executable은 @FunctionalInterface로 메소드를 단 1개만 갖기 때문에 Lambda 표현식을 사용할 수 있습니다.(@FunctionalInterface에 대해서 궁금하신 분은 다음 포스팅을 확인해주세요. https://sas-study.tistory.com/258)
- Executable... 이란 타입은 여러개의 람다가 포함될 수 있음을 이야기합니다.
@Test
void test1() {
assertAll(
//A Case
() -> assertFalse(true, "Exception!!!"),
//B Case
() -> {
TestObject tObj = null;
assertNotNull(tObj, "Object is Null!!");
});
}
다음과 같이 각 테스트마다 람다표현식으로 Supplier 내에 assert 메소드를 사용해주면 됩니다.
다음과 같이 Exception!! 과 Object is Null!! 이라는 에러메시지 두개가 나란히 나타난 것을 볼 수 있습니다.