💡 개요
오늘은 Spring에서 테스트 코드에서 데이터 셋업에 사용되는 @BeforeAll을 정리해 보자.
📕 @BeforeAll
@BeforeAll은 테스트 실행 전에 한 번만 실행되는 메서드에 붙이는 어노테이션이다.
주로 테스트에서 반복적으로 사용되는 데이터를 셋업 할 때 사용된다.
@BeforeAll을 사용하려면 해당 메서드를 static으로 선언하거나, 클래스에 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 어노테이션을 추가해야 한다.
🛠️ static 메서드 사용
@BeforeAll
static void setup() {
// 테스트 실행 전 한 번만 실행됨
}
static으로 선언하면 테스트 인스턴스가 생성되기 전에 클래스 레벨에서 실행된다.
🛠️ @TestInstance(TestInstance.Lifecycle.PER_CLASS) 사용
그런데 만약 메서드를 static 으로 선언하기 싫다면 테스트 클래스에 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 을 선언하면 된다.
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MyTest {
@BeforeAll
void setup() {
// static 없이 사용 가능
}
}
@TestInstance(TestInstance.Lifecycle.PER_CLASS)를 선언하면 클래스 인스턴스 단위로 테스트가 실행되기 때문에, static 없이도 @BeforeAll을 사용할 수 있다.
참고로 JUnit 테스트 코드의 기본 단위는 PER_METHOD이다.
그렇기 때문에 메서드 별로 새로운 인스턴스를 생성하는 것이다.
❓ @BeforeAll은 기본적으로 static이 필요한 이유
JUnit은 기본적으로 테스트에 사용되는 메서드마다 새로운 인스턴스를 생성해 사용한다. (이런 방식을 사용해야 모든 테스트가 독립적으로 실행됨)
그런데 @BeforeAll을 일반 메서드(non-static)로 선언하면, 어떤 객체의 메서드를 실행해야 할지 알 수 없다.
하지만 static 메서드는 클래스 레벨에서 실행되기 때문에 인스턴스 생성 전에 실행될 수 있다.
그리고 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 을 사용하면 테스트 클래스의 인스턴스를 메서드 별로 새로 생성하는 것이 아니라 한 번만 생성하기 때문에 static 없이도 사용 가능하다.
만약 JUnit의 기본 동작(각 테스트 메서드마다 새로운 인스턴스 생성)을 유지하면서 @BeforeAll을 사용하고 싶다면, static을 사용하자..
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.03.15 - LATERAL JOIN (0) | 2025.03.15 |
---|---|
[개발 일기] 2025.03.14 - 인메모리는 휘발성이라매 (0) | 2025.03.14 |
[개발 일기] 2025.03.12 - filter에서 발생하는 예외 (0) | 2025.03.12 |
[개발 일기] 2025.03.11 - compareTo() (0) | 2025.03.11 |
[개발 일기] 2025.03.10 - 날짜 데이터 타입 (0) | 2025.03.10 |