起きたこと
SonarQubeのバージョンアップを実施した後、
JUnitのライフサイクルメソッドでスコープがprivateになっているものに
java:S5810 のBugが検出されるようになりました。
しかし動作確認をしてみると、privateのライフサイクルメソッドは動作しているようでした。
不思議に思い少し調べてみたメモです。
環境
- SonarQube Server
2025.1 LTA -> 2026.1 LTA - JUnit Version
JUnit Jupiter 6.0.2
JUnit Jupiterのバージョンアップで起こっていたこと
5.9.0 での破壊的な変更
JUnit Jupiter 5.9.0 で行われた破壊的な変更
Private lifecycle methods (annotated with @BeforeAll, @AfterAll, @BeforeEach, or @AfterEach) now correctly lead to an exception. Although this is a bug fix, it is technically also a breaking change since there might be existing user code with private lifecycle methods which will now start to fail.
プライベートなライフサイクルメソッドは正しく例外を発生させるようになりました。これはバグ修正ではありますが、既存のライフサイクル メソッドを含むユーザー コードが動作しなくなる可能性があるため、技術的には破壊的変更でもあります。
5.9.2でのリバート
JUnit Jupiter 5.9.2で行われた前述の破壊的な変更のリバート
Lifecycle methods are allowed to be declared as private again for backwards compatibility; however, using private visibility for lifecycle methods is strongly discouraged and will be disallowed in a future release.
ライフサイクルメソッドは、後方互換性のために再度private宣言することが許可されています。ライフサイクルメソッドにprivate可視性を使用することは強く推奨されず、将来のリリースでは禁止される予定です。
起きていたこと
5.9.0でprivateスコープのライフサイクルメソッドが例外を発生させるようになる修正が行われた。
しかし5.9.2でその修正はリバートされた。(クレームがあったのでしょうか…?)
そのため5.9.3以降では5.9.0より前と同様にprivateスコープのライフサイクルメソッドは動作する状態だった。
しかし5.9.3のRelease Notesには
ライフサイクルメソッドにprivate可視性を使用することは強く推奨されず、将来のリリースでは禁止される予定です。
と記載されており、将来的に5.9.0と同様に動かなくなる可能性があるため、SonarQubeではBugとして検知されている。
という状態なのかなと思います。
そのため、我々のプロジェクトではこのIssueをチェックから外したり、Acceptedするのではなく、発見次第修正していく形で対応することにしました。
おわり。