Static Initializer (static block{}}는 JUnit이 아닌 JVM에 의해 호출 된다. 만약 예외가 static initializer 내부에서 발생된다면 테스트 프레임워크는 예외를 처리하고 보고하는 작업을 못 한다. 더 나아가 static initializer의 호출 시간은 @BeforeClass
메서드와 비교하여 잘 정의되지 않는다. static initializer는 정적 속성, 정적 메서드 또는 생성자 중 하나의 접근과 같은 첫 번째 실제 사용 시 클래스 로더당 한 번만 실행된다. 때론 이게 언제가 될지 가늠하기 어려울 때가 있다. (그래서 static initializer는 미래에 복잡한 버그를 야기할 수 있다.)
반면에 @BeforeClass
는 각 클래스의 테스트 코드가 실행되기 전 실행된다. 클래스가 상속에 기반한 테스트와 같이 다른 테스트의 대상이 되는 경우 static initializer는 이 클래스를 사용하여 첫 번째 테스트에서만 실행된다. 이것은 우리가 결코 원하지 않는 것에 따라 우리의 test order를 만들었다는 것을 의미한다.
두 옵션 사이의 의미론적 차이는 테스트를 위해 @Before
또는 생성자를 사용하는 것보다 더 크다. final
매개변수에 따라 주석의 문서적 가치에 대해 생각해보라. 그것은 우리의 의도를 더 읽기 쉽게 만든다.
이 규칙의 유일한 예외는 불변의 상수일 것이다. 컴파일 시간 상수를 반영하고 코드를 간결하게 유지하기 위해 선언내에서 초기화해야 한다. 값이 아무리 변덕스럽다 해도 정적 값을 전혀 사용해서는 안 된다. 다시 말하지만, 테스트에서 변경되는 mutable 값은 피해야 할 테스트에 순서 의존성을 도입한다.
그래서, @BeforeClass
를 사용해라!
+) JUnit의 실행 순서를 자세히 살펴보면 static block
-> @Parameter
-> @BeforeClass
-> Before
-> @Test
식으로 흘러간다.
'👨🏻💻 Development > ☕️ Java' 카테고리의 다른 글
2021년 09월 16일 TIL - Mocking Static Method (0) | 2021.09.17 |
---|---|
2021년 09월 07일 TIL - 의존 역전 원칙 (Java) (0) | 2021.09.08 |
Java의 Object 클래스 (0) | 2021.08.07 |
[Java] String, StringBuffer, StringBuilder (0) | 2021.08.02 |