4.8 KiB
4.8 KiB
代码审查报告
文件: data\demo-pmd\src\com\demo\errorprone\extra\JUnit5RulesTest.java
语言: java
耗时: 139.8s
分析工具: pmd
总计: 14 | 错误: 2 | 警告: 11 | 建议: 1
静态分析 · 9 个问题
- 🔴
pmd:SystemPrintlnL25 使用了 System.out/err 输出。 建议: 避免直接使用 System.out.println,建议使用日志框架(如 SLF4J/Log4j2)或 java.util.logging.Logger。例如:private static final Logger LOG = Logger.getLogger(JupiterMain.class.getName()); LOG.info("demo jupiter"); - 🟡
pmd:AtLeastOneConstructorL9 每个类都应至少声明一个构造函数。 建议: 为类添加一个无参构造函数。由于当前是测试类,可添加 public JupiterPublicTest() {} 以消除警告。 - 🟡
pmd:JUnitJupiterTestShouldBePackagePrivateL9 JUnit 5 测试类应为包私有。 建议: 移除 public 修饰符,将 'public class JupiterPublicTest' 改为 'class JupiterPublicTest'。 - 🟡
pmd:JUnitJupiterTestShouldBePackagePrivateL11 JUnit 5 测试方法应为包私有。 建议: 移除 public 修饰符,将 'public void testPublic()' 改为 'void testPublic()'。 - 🟡
pmd:UnitTestShouldIncludeAssertL11 该单元测试应包含 assert() 或 fail() 断言。 建议: 在测试方法体中添加断言,例如:org.junit.jupiter.api.Assertions.assertTrue(true)。如果测试业务逻辑,请断言实际返回值或状态。 - 🟡
pmd:AtLeastOneConstructorL16 每个类都应至少声明一个构造函数。 建议: 为 JupiterPrivateTest 类添加一个包私有无参构造函数,例如:JupiterPrivateTest() {} - 🟡
pmd:UnusedPrivateMethodL18 避免使用未使用的私有方法 'testPrivate()'。 建议: testPrivate 是私有方法且未被使用,但又标注了 @Test。建议将其改为包私有方法(移除 private),使其成为有效的测试方法;如果它是普通辅助方法,则应在类内调用或删除。 - 🟡
pmd:JUnitJupiterTestNoPrivateModifierL18 JUnit 测试方法不能是 private。 建议: 删除 private 修饰符,改为包私有:private void testPrivate() 改为 void testPrivate()。注意:私有测试方法会导致 JUnit 执行失败,而不是被忽略。 - 🟡
pmd:UnitTestShouldIncludeAssertL18 该单元测试应包含 assert() 或 fail() 断言。 建议: 在 testPrivate 方法中加入断言,例如:org.junit.jupiter.api.Assertions.assertTrue(true)。同时建议将方法改为包私有。
AI 审查 · 5 条建议
- 🔴 [AI] [bug]
main-class-must-be-publicL23 主类 JupiterMain 不是 public,无法作为程序入口 Java 应用程序入口要求主类是 public(且 main 方法为 public static void)。JupiterMain 为包私有类,使用 java JupiterMain 启动时 JVM 会报找不到 main 方法。若该类仅用于演示,也应提取为独立 public 类。 建议: 将 JupiterMain 提取到独立文件 JupiterMain.java,并将类声明改为 public class JupiterMain。当前文件中已有一个 public 类 JupiterPublicTest,不能同时存在两个 public 顶层类。 - 🟡 [AI] [design]
one-top-level-class-per-fileL9 同一文件包含多个顶层类,降低可维护性 该文件中同时定义了 JupiterPublicTest、JupiterPrivateTest 和 JupiterMain 三个顶层类。虽然 Java 允许在一个 .java 文件中声明多个非 public 顶层类,但实践上每个类应单独一个文件,以提升可读性和可维护性,并避免外部包导入时的困惑。 建议: 将每个顶层类分别放入独立的 .java 文件中,并确保 public 类的文件名与其类名一致。 - 🟡 [AI] [style]
class-naming-misleadingL16 类名 JupiterPrivateTest 与可见性语义不符 Java 顶层类不能为 private。JupiterPrivateTest 实际是包私有类,但类名容易让人误以为它是 private;该类中的测试方法也恰好是 private,进一步造成混淆。 建议: 将类改名为 JupiterPackagePrivateTest 或类似不含 private 的名称,同时将私有测试方法改为包私有。 - 🟡 [AI] [bug]
misleading-comment-junit-privateL18 注释称私有测试方法不会执行,与 JUnit 5 实际行为不符 代码注释写着 'private 测试方法,不会执行',但 JUnit Jupiter 的 @Test 方法声明为 private 时,JUnit 会在运行时报告测试失败(JUnitException),而不是忽略。这种错误注解会误导开发者。 建议: 更新注释为准确描述,并将测试方法改为包私有,确保其被 JUnit 执行。 - 🔵 [AI] [style]
test-method-namingL11 测试方法名 testPublic 不具描述性 测试方法名仅表达了'公开',未反映被测试的行为或预期结果。好的测试命名应说明场景和预期,例如 shouldReturnXWhenY。 建议: 将方法重命名为更具行为描述性的名称,例如 shouldReturnExpectedValue()。