Loading the catalog…
Loading the catalog…
JUnit 5에서는 @Nested 를 사용해 테스트 클래스 내부에 중첩 클래스를 만들 수 있다. 테스트 대상이 많아지면 하나의 SolutionTest 안에 테스트 메서드가 계속 쌓이면서 어떤 기능을 검증하는 테스트인지 구분하기 어려워질 수 있다. 이때 관련된 테스트를 중첩 클래스로 묶으면 테스트의 목적과 구조를 더 명확하게 표현할 수 있다. 기본 사용법 import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class SolutionTest { private final Solution solution = new Solution(); @Nested @DisplayName("소수 판별 테스트") class IsPrimeTest { @Test @DisplayName("소수는 true를 반환한다") void primeNumber() { assertTrue(solution.isPrime(7)); } @Test @DisplayName("합성수는 false를 반환한다") void compositeNumber() { assertFalse(solution.isPrime(9)); } } } @Nested 가 붙은 IsPrimeTest 클래스 안에 isPrime() 과 관련된 테스트를 모아 두었다. IntelliJ에서 실행하면 테스트 결과 역시 계층적으로 표시된다. SolutionTest └─ 소수 판별 테스트 ├─ 소수는 true를 반환한다 └─ 합성수는 false를 반환한다 단순히 코드만 묶는 것이 아니라 테스트 결과 화면에서도 어떤 기능의 테스트인지 쉽게 확인할 수 있다는 장점이 있다. 여러 구현을 테스트할 때 활용하기 같은 기능을 서로 다른 방식으로 구현했다면 @Nested 를 사용해 테스트 목적을 유지하면서 여러 구현을 함께 검증할 수도 있다. 예를 들어 두 개의 소수 판별 메서드가 있다고 하자. boolean isPrime(int n) boolean isPrime2(int n) 두 메서드는 모두 int → boolean 형태이므로 IntPredicate 를 이용해 동일한 테스트 로직을 재사용할 수 있다. import java.util.function.IntPredicate; @Nested @DisplayName("소수 판별 테스트") class IsPrimeTest { private void verifyPrimeMethod(IntPredicate isPrime) { assertTrue(isPrime.test(2)); assertTrue(isPrime.test(7)); assertTrue(isPrime.test(97)); assertFalse(isPrime.test(1)); assertFalse(isPrime.test(9)); assertFalse(isPrime.test(49)); } @Test @DisplayName("isPrime 구현") void isPrime() { verifyPrimeMethod(solution::isPrime); } @Test @DisplayName("isPrime2 구현") void isPrime2() { verifyPrimeMethod(solution::isPrime2); } } 이렇게 하면 테스트 데이터와 검증 코드는 한 번만 작성하고, 실제 알고리즘 구현만 바꿔서 동일한 테스트를 적용할 수 있다. 결과 구조도 다음처럼 명확하게 표시된다. SolutionTest └─ 소수 판별 테스트 ├─ isPrime 구현 └─ isPrime2 구현 @Nested 를 사용하는 이유 @Nested 의 가장 큰 장점은 테스트를 단순한 메서드 목록이 아니라 기능별 계층 구조 로 표현할 수 있다는 점이다. 예를 들어 하나의 클래스에 여러 기능이 있다면 다음처럼 구성할 수 있다. class SolutionTest { @Nested class IsPrimeTest { // isPrime 관련 테스트 } @Nested class FactorizeTest { // factorize 관련 테스트 } @Nested class SolutionMethodTest { // solution 관련 테스트 } } 테스트 대상의 구조와 테스트 코드의 구조를 비슷하게 만들 수 있기 때문에 테스트 코드가 많아질수록 가독성이 좋아진다. @DisplayName 과 함께 사용하기 @Nested 는 @DisplayName 과 함께 사용하면 특히 유용하다. @Nested @DisplayName("소수 판별") class IsPrimeTest { @Test @DisplayName("2보다 작은 수는 소수가 아니다") void lessThanTwo() { // ... } } 테스트 결과가 다음과 같이 자연어에 가까운 형태로 나타난다. 소수 판별 └─ 2보다 작은 수는 소수가 아니다 메서드명만으로 테스트 의도를 모두 표현하는 것보다 결과를 읽기 쉽다. 정리 JUnit 5의 @Nested 는 관련된 테스트를 중첩 클래스로 묶어 테스트 코드를 구조화할 수 있게 해준다. 특히 다음과 같은 경우 유용하다. 하나의 테스트 클래스에서 여러 기능을 테스트할 때 정상 상황과 예외 상황을 구분하고 싶을 때 동일 기능의 여러 구현을 비교할 때 테스트 결과를 계층적으로 확인하고 싶을 때 이번 테스트에서는 isPrime() 과 isPrime2() 라는 두 구현을 하나의 IsPrimeTest 안에 묶고, IntPredicate 를 이용해 공통 테스트 로직까지 재사용했다. 이를 통해 @Nested 는 단순히 테스트 클래스를 나누는 기능이 아니라, 테스트 코드 자체로 기능과 테스트 의도를 표현하는 수단 으로 사용할 수 있다는 점을 확인할 수 있었다.
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
JUnit 5 `@Nested`로 테스트 코드 구조화하기. JUnit 5에서는 @Nested 를 사용해 테스트 클래스 내부에 중첩 클래스를 만들 수 있다. 테스트 대상이 많아지면 하나의 SolutionTest 안에 테스트 메서드가 계속 쌓이면서 어떤 기능을 검증하는 테스트인지 구분하기 어려워질 수 있다. 이때 관련된 테스트를 중첩 클래스로 묶으면 테스트의 목적과 구조를 더 명확하게 표현할 수 있다. 기본 사용법 import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*;…
Open source