rspec/rules/S5786/java/rule.adoc

85 lines
2.4 KiB
Plaintext
Raw Normal View History

JUnit5 test classes and methods should generally have package visibility.
To fix this issue, change their visibility to the default package visibility.
== Why is this an issue?
JUnit5 is more tolerant regarding the visibility of test classes and methods than JUnit4, which required everything to be `public`.
Test classes and methods can have any visibility except `private`.
It is however recommended to use the default package visibility to improve readability.
[quote, JUnit5 User Guide]
____
Test classes, test methods, and lifecycle methods are not required to be `public`, but they must not be `private`.
It is generally recommended to omit the public modifier for test classes, test methods, and lifecycle methods unless there is a technical reason for doing so for example, when a test class is extended by a test class in another package.
Another technical reason for making classes and methods public is to simplify testing on the module path when using the Java Module System.
____
=== What is the potential impact?
The code will be non-conventional and readability can be slightly affected.
=== Exceptions
This rule does not raise an issue when the visibility is set to `private`, because `private` test methods and classes are systematically ignored by JUnit5, without a proper warning.
In this case, there is also an impact on reliability and so it is handled by the rule https://rules.sonarsource.com/java/RSPEC-5810/[S5810].
2021-04-28 16:49:39 +02:00
== How to fix it
2021-04-28 16:49:39 +02:00
You can simply change the visibility by removing the `public` or `protected` keywords.
2021-04-28 16:49:39 +02:00
=== Code examples
==== Noncompliant code example
2021-04-28 16:49:39 +02:00
[source,java,diff-id=1,diff-type=noncompliant]
2021-04-28 16:49:39 +02:00
----
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
2021-04-28 16:49:39 +02:00
[source,java,diff-id=1,diff-type=compliant]
2021-04-28 16:49:39 +02:00
----
import org.junit.jupiter.api.Test;
class MyClassTest {
@Test
void test() {
// ...
}
}
----
== Resources
2021-04-28 16:49:39 +02:00
=== Documentation
* https://junit.org/junit5/docs/current/user-guide/#writing-tests-classes-and-methods[JUnit5 User Guide: Test Classes and Methods]
ifdef::env-github,rspecator-view[]
'''
== Implementation Specification
(visible only on this page)
=== Message
Remove this '[public|protected]' modifier.
=== Highlighting
wrong visibility modifier of the test method/class
endif::env-github,rspecator-view[]