https://github.com/lhoju0158

개발 끄적끄적

[JUnit5] 테스트 인스턴스 생성 시점?

lhoju0158 2025. 10. 27. 21:09

들어가며..

 

테스트 코드에선 객체 생성 비용에 대해 고민하지 않았다. (약간 한 대 맞은 기분..) 따라서 이에 대해 학습하고 싶었다. 

 

테스트 인스턴스 라이플 사이클

공식 문서에 따르면.. 

  • 테스트 인스턴스의 상태는 불변이 아니므로 예기치못한 부작용이 발생할 위험이 있다.
  • 이러한 위험을 피하고, 각 테스트 메서드를 격리해서 실행하기 위해서 JUnit은 각 테스트 메서드를 실행하기 전에 해당 테스트 클래스의 인스턴스를 새로 만든다.
  • 각 테스트 메서드 마다(per-method) 새로운 테스트 인스턴스가 만들어지는 것은 JUnit의 기본 동작방식이다.

라고 적혀있다. 즉, 기본값이 메서드 마다 새로운 테스트 인스턴스 생성이다.

 

 

그러면 여기서 질문.. @BeforeAll은 어떻게 실행되는가? 

 

 

참고로 @BeforeEach는 개별 테스트 실행 전 실행되고, @BeforeAll은 모든 테스트 실행 전 한 번만 실행된다.

근데 메서드마다 새로운 인스턴스가 생성되는데 어떻게 @BeforeAll 내부는 한번만 실행되는걸까?

 

 

답은 static이다. 

 

 

@BeforeAll의 실행 메커니즘은 다음과 같다.

 

1. JUnit이 TestClass를 발견하고, 이를 로딩할 때 static 영역에 static 필드 + @BeforeAll 메서드를 올린다.

2. 이후 @BeforeAll static 메서드를 호출한다. 이는 자원을 초기화 해 static 필드에 저장한다.

3. 이후 인스턴스는 static 영역을 이용해서 @BeforeAll의 결과에 접근한다.

 

추가로 Java는 static멤버와 인스턴스 멤버를 메모리에 아예 다르게 저장한다. 

 

새로운 인스턴스 -> heap 영역

static 멤버 -> static 영역

 

정리

따라서 위 리뷰어의 의견과 내 코드는 동일한 효과를 만든다. 하지만 이를 아예 staic 필드로 변경해서 한번만 실행되게 유도하는 것이 좋아보인다. 

 

참고 자료

https://kotlinworld.com/472

 

[JUnit5] @BeforeEach와 @BeforeAll은 어떤 차이가 있을까?

@BeforeEach와 @BeforeAll의 차이 @BeforeEach와 @BeforeAll는 실행 시점에 차이가 있다. 둘 모두 테스트 시작 전에 실행되는 것은 같지만, @BeforeEach는 개별 테스트 실행 전에 실행되며, @BeforeAll은 모든 테스트

kotlinworld.com

https://hyunki99.tistory.com/3

 

[Java] 자바 메모리 영역 Static, Stack, Heap

프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받고 그 메모리를 목적에 따라서 여러 영역으로 나누어 관리한다. 1. Static 영역 (Method Area, Class Area, Code Area라고도 불린다.) Java 파일은 크게 필

hyunki99.tistory.com