[JUnit5] Assertion 메소드(assertTrue, assertEquals, assertAll 등)

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!! 이라는 에러메시지 두개가 나란히 나타난 것을 볼 수 있습니다.

댓글

Designed by JB FACTORY