JUnit5 테스트 메서드는 왜 public 이면 안될까?

2024. 1. 8. 19:46Project 해축갤/테스트 코드

728x90

최근 코드 품질을 올리고 싶어 IDE에 SonarLint을 설치했더니 다음과 같은 경고를 받게 됐다.

public 없애라

요는 테스트 메서드에서 public 접근 제어자를 없애라라는 경고이다.

필자가 아는 지식은 JUnit 이 실행시에 테스트 메서드를 Reflection API로 뜨기 위해서

public 접근 제어자가 필수라고 알고 있었다.

JUnit 5 제작자 왈

JUnit 5 메서드의 접근 제어자 규칙

public 일 필요는 없지만, private 이면 안된다! 
일반적으로 public 제어자는 기술적인 모종의 이유가 아닌 이상 쓰지 말아라

[출처] : https://junit.org/junit5/docs/current/user-guide/#writing-tests-classes-and-methods

 

JUnit5 개발자 Sam Brannen

요약하자면 우리 JUnit 5 팀은 "Less is more" 라는 모토로, 더 적게 치는 목표일수록 더 좋다는 말을 믿고 개발했습니다!

[출처] https://stackoverflow.com/questions/55215949/why-junit-5-default-access-modifier-changed-to-package-private#answer-55230350

 

즉 JUnit5 제작자들은 가독성을 위해서 사용하지 말라는 얘기를 합니다.

그리고 자바 개발시에 접근 제어자는 가능한 좁게 사용하라는 이유와 동일하기도 합니다.

그래도 public 이 아닌 건 어떻게?

JUnit5는 이전보다 더 광범위하게 Reflection API를 사용해 class, method 들을 찾고 non-visible 멤버들에 값을 주입합니다. 몇몇의 코드들은 setAccesible(true)로 non-public 필드에 접근합니다.

[출처] : https://stackoverflow.com/questions/77005897/how-can-junit-5-access-run-test-methods-without-the-public-modifer#answer-77005946

 

즉 기존의 Reflection API를 사용해서 접근을 한다는 것!

정리

  • ~ JUnit 4까지 모든 테스트 메서드는 public 이여야 했다.
  • JUnit 5부터는 setAccesible(true) 등의 Reflection API를 사용해 public 이 아니어도 괜찮다.
  • public을 안 쓰면 코드 컨벤션, 가독성등 일반적으로 접근 제어자를 좁게 사용해야 하는 장점이 있다!
728x90