[SonarQube 06] JUnit 5에서는 Test class에 접근제한자 붙이지 말기

JUnit 4 에서는 접근제한자 "public"을 반드시 붙여야 했다.

 

test 코드에서 public을 붙여서 코드를 작성했더니 아래와 같은 말을 들었다. 

 

 

JUnit5 is more tolerant regarding the visibilities of Test classes than JUnit4, which required everything to be public.

In this context, JUnit5 test classes can have any visibility but private, however, it is recommended to use the default package visibility, which improves readability of code.

Noncompliant Code Example

import org.junit.jupiter.api.Test;

public class MyClassTest { // Noncompliant - modifier can be removed
  @Test
  protected void test() { // Noncompliant - modifier can be removed
    // ...
  }
}

 

소나큐브에서 위와 같이 적혀 있던 코드를 아래와 같이 바꾸라는 말을 했다. 

 

Compliant Solution

import org.junit.jupiter.api.Test;

class MyClassTest {
  @Test
  void test() {
    // ...
  }
}

Exceptions

This rule does not raise an issue about private visibility, because private test methods and classes are systematically ignored by JUnit5, without a proper warning. It’s not a Code Smell but a Bug handled by the rule S5810 .

See

 

왜 JUnit 5 에서는 접근 제한자를 지워야 하는지 찾아보니 5부터는 modifier가 package-private로 바뀌었단다.

 

package-private 이란 java 에서 기본적으로 사용되는 접근 제한자로 접근 제한자를 명시하지 않을 때 사용되는 것이다.
이 접근 제한자는 클래스, 메소드, 변수 등에 적용할 수 있고 동일한 패키지 내에서만 접근 가능하도록 제한한다.

이러한 접근 제한은 캡슐화를 통해 코드의 유지 보수성 향상시키는 데 도움이 된다.

 

 

좀 더 자세히 찾기 위해 stack overflow에서 찾아보니 아래와 같은 답변을 찾을 수 있었다.

 

Why is the default access modifier in JUnit 5 package-private?

It's not the "default". There technically is no default. Rather, in JUnit Jupiter you have a choice: public, protected or package-private.

 

What is the benefit of changing it to package-private?

The benefit is that you don't have type public anymore. If your IDE automatically generates test methods and test classes for you that are public, feel free to leave them public.

But... if you are typing in the methods on your own, then just leave off public unless you are designing your test classes for subclassing from other packages, in which case you'd want to make your overrideable test methods
either public or protected. And of course, interface default methods must be public.

Long story, short: we (the JUnit 5 team) believe in the principle "Less is more", meaning the less you have to type to achieve your goal, the better!

 

정리하자면 그냥 JUnit 5 를 쓸거면 접근제한자를 붙이지 말자. 이게 맞나

 

 

- 참고 링크

https://stackoverflow.com/questions/55215949/why-junit-5-default-access-modifier-changed-to-package-private