SSAFY11th-book-study / book-study

SSAFY 11기 6반의 '토비의 스프링 스터디'
0 stars 0 forks source link

[2.2.2] JUnit 테스트 메서드 public 제약 #20

Closed gmelon closed 6 months ago

gmelon commented 6 months ago

JUnit 4.x 버전에서는 테스트 메서드가 public 이어야 한다는 제약이 있었지만 JUnit 5 버전으로 넘어오며 해당 제약이 사라진 것으로 알고 있습니다. 4.x 버전에서는 왜 해당 제약이 필요했으며, 5.x 버전에서는 왜 / 어떻게 해당 제약을 없앨 수 있었던 것인지 궁금합니다.

저도 내일 찾아보고 댓글 달아두겠습니다!

sootudio commented 6 months ago

제가 찾아봤을 때는, 테스트를 실행하는 방식이 바뀌었기 때문이라고 이해했습니다.

JUnit 4.x 버전에서는 테스트를 찾고 실행할 때 Reflection을 사용했고, Java에서는 Reflection을 사용해서 접근 권한이 없는 메서드를 외부에서 호출하는 것을 지양하기 때문에, 테스트 메서드를 public으로만 만들어야 했습니다. (호출이 가능하긴 한데, 안전성이나 유지 보수의 어려움 때문에 권장되지 않는다고 이해했는데... 맞나요?)

이와 달리 JUnit 5.x 버전에서는 테스트를 실행할 때 컴파일된 클래스 파일의 메타데이터를 통해 테스트를 찾고 실행한다고 합니다. 메타데이터를 사용한 방식은 Reflection과 달리 클래스에 접근하여 메서드를 호출하거나 필드에 접근하지 않기 때문에 테스트 메서드가 어떤 접근 제한자를 가지던지 상관 없이 실행을 할 수 있다고 합니다.

정리하자면, JUnit4에서는 Reflection을 사용하여 테스트를 실행하기 때문에 자바의 접근 제어 규칙을 위배하지 않기 위해 테스트 메서드를 public으로 만들어야 했지만, JUnit5에서는 Reflection을 사용하지 않고, 메타데이터를 통해 테스트를 찾고 실행하기 때문에 접근 제한자에 제약을 받지 않고 테스트 메소드를 만들 수 있게 되었다고 설명할 수 있습니다.

gmelon commented 6 months ago

감사합니다! 추가 자료 첨부합니다

gmelon commented 6 months ago

사실 JDK 1.2 부터 리플렉션을 사용하면 public이 아니어도 접근이 가능하지만, JDK 1.1 이전 public 이어야 했던 관례가 JUnit 4.x 까지 이어지고 있던 것으로 생각됨

JUnit 5.x 에서는 구조와 설계가 많이 변경되면서 이를 개선한 것으로 추정

전통