JUnit5 테스트 메서드는 왜 public 이면 안될까?
2024. 1. 8. 19:46ㆍProject 해축갤/테스트 코드
728x90
최근 코드 품질을 올리고 싶어 IDE에 SonarLint을 설치했더니 다음과 같은 경고를 받게 됐다.
요는 테스트 메서드에서 public 접근 제어자를 없애라라는 경고이다.
필자가 아는 지식은 JUnit 이 실행시에 테스트 메서드를 Reflection API로 뜨기 위해서
public 접근 제어자가 필수라고 알고 있었다.
JUnit 5 제작자 왈
public 일 필요는 없지만, private 이면 안된다!
일반적으로 public 제어자는 기술적인 모종의 이유가 아닌 이상 쓰지 말아라
[출처] : https://junit.org/junit5/docs/current/user-guide/#writing-tests-classes-and-methods
요약하자면 우리 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
'Project 해축갤 > 테스트 코드' 카테고리의 다른 글
Java @Scheduled: 매시 정각에 실행되는 Cron 표현식 테스트하기 (1) | 2023.12.20 |
---|---|
테스트 띠띠ㅣ디ㅣ디ㅣ딛ㄹ딸깍? postman 으로 '띡띡딸깍' 하기 (1) | 2023.11.30 |
Hibernate의 "Detached Entity Passed to Persist" 오류 이해와 해결 (0) | 2023.11.08 |
org.mockito.exceptions.misusing.UnnecessaryStubbingException 해결 (0) | 2023.11.07 |
테스트를 더 빨리 끝내보기 (feat. 자료구조, singletonList) (0) | 2023.11.02 |