7.5 KiB
7.5 KiB
代码审查报告
文件: data\demo-pmd\src\com\demo\errorprone\extra\JUnit3RulesTest.java
语言: java
耗时: 213.2s
分析工具: pmd
总计: 20 | 错误: 4 | 警告: 14 | 建议: 2
静态分析 · 15 个问题
- 🔴
pmd:MethodNamingConventionsL12 实例方法名 'TearDown' 不符合 '[a-z][a-zA-Z0-9]*' 命名规范(L12)。 建议: 将 TearDown() 重命名为 tearDown(),使其以大写字母开头变为小写开头,并作为 JUnit3 的清理方法使用。 - 🔴
pmd:SystemPrintlnL30 使用了 System.out/err(L30)。 建议: 在正式代码中改用日志框架,例如 java.util.logging.Logger;也可为 Junit3Main 注入输出流以便测试。 - 🟡
pmd:AtLeastOneConstructorL9 每个类都应至少声明一个构造函数(L9)。 建议: 为 JUnitSpellingTest 添加显式构造函数,例如:public JUnitSpellingTest() { super(); }。若该类保留为 public 且供 JUnit3 使用,这个公共无参构造函数也满足 JUnit3 反射实例化的要求。 - 🟡
pmd:TestClassWithoutTestCasesL9 类 'JUnitSpellingTest' 可能是测试类,但未包含任何测试用例(L9)。 建议: 在该类中新增一个以 test 开头、返回 void、公共无参的测试方法,并添加断言。例如:public void testExample() { assertTrue(true); }。如果该类用于存放公共测试工具,则不应继承 TestCase。 - 🟡
pmd:JUnitSpellingL10 你可能拼错了 JUnit 框架方法(setUp 或 tearDown)(L10)。 建议: 将 setup() 重命名为 setUp(),确保 JUnit3 将其识别为初始化方法。若方法体为空,请补充资源初始化逻辑;否则该声明无实际作用。 - 🟡
pmd:JUnitSpellingL12 你可能拼错了 JUnit 框架方法(setUp 或 tearDown)(L12)。 建议: 将 TearDown() 重命名为 tearDown(),使其被 JUnit3 识别为 teardown 生命周期方法。 - 🟡
pmd:AtLeastOneConstructorL17 每个类都应至少声明一个构造函数(L17)。 建议: 为 JUnitStaticSuiteTest 添加显式构造函数,例如:public JUnitStaticSuiteTest() { super(); }。注意测试类本身还应为 public,才能被 JUnit3 外部加载。 - 🟡
pmd:TestClassWithoutTestCasesL17 类 'JUnitStaticSuiteTest' 可能是测试类,但未包含任何测试用例(L17)。 建议: 将 suite() 改为 public static junit.framework.Test suite(),并返回包含测试方法的 TestSuite,例如:return new TestSuite(JUnitStaticSuiteTest.class)。同时确保类中至少有一个 test 开头的方法。 - 🟡
pmd:PublicMemberInNonPublicTypeL18 在非 public 类型 JUnitStaticSuiteTest 中声明了 public 成员 'suite'(L18)。 建议: JUnit3 要求 suite() 为 public,因此最佳修复是将类 JUnitStaticSuiteTest 移到独立文件并声明为 public class JUnitStaticSuiteTest;不要简单地把方法改为包私有,否则 JUnit 无法调用 suite 入口。 - 🟡
pmd:JUnitStaticSuiteL18 你有一个 suite() 方法不是 public 且 static,JUnit 不会调用它来获取 TestSuite。这是你期望的吗?(L18) 建议: 将方法签名改为 public static junit.framework.Test suite(),并返回一个 TestSuite 实例,例如 return new TestSuite(JUnitStaticSuiteTest.class)。 - 🟡
pmd:AtLeastOneConstructorL23 每个类都应至少声明一个构造函数(L23)。 建议: 为 DetachedTest 添加显式构造函数,例如:public DetachedTest() { super(); }。同时建议将类改为 public 并放入独立文件。 - 🟡
pmd:DetachedTestCaseL24 可能存在脱离测试套件的 JUnit 测试用例(L24)。 建议: 确保测试类为 public,以便 JUnit3 反射实例化;并将该类纳入某个 TestSuite。若迁移到 JUnit4/5,请使用 @Test 注解替代 test 前缀。 - 🟡
pmd:PublicMemberInNonPublicTypeL24 在非 public 类型 DetachedTest 中声明了 public 成员 'testSomething'(L24)。 建议: 将 DetachedTest 改为 public class,并放入独立文件 DetachedTest.java。JUnit3 测试方法必须为 public,因此不要降低方法的可见性。 - 🟡
pmd:UnitTestShouldIncludeAssertL24 此单元测试应包含 assert() 或 fail()(L24)。 建议: 在 testSomething() 中添加有意义的断言,例如 assertEquals(2, 1 + 1)。空测试永远通过,无法保护代码。 - 🟡
pmd:UnitTestShouldUseTestAnnotationL24 单元测试应使用 @Test 注解,否则不会运行。对于 JUnit Jupiter,还可使用 @RepeatedTest、@TestFactory、@TestTemplate 或 @ParameterizedTest 注解(L24)。 建议: 若迁移到 JUnit4/5,移除 TestCase 继承,在方法上添加 @Test,并使用 org.junit.jupiter.api.Assertions 断言。当前 JUnit3 风格可通过修正类可见性继续运行,但推荐升级。
AI 审查 · 5 条建议
- 🔴 [AI] [bug]
non-public-junit3-test-classL17 JUnit3 测试类必须声明为 public 才能被发现 JUnitStaticSuiteTest 和 DetachedTest 都是包私有类。JUnit3 运行器通过反射从外部包加载测试类,非 public 类会导致测试被跳过或抛出 IllegalAccessException。即使方法都声明为 public,类本身不可见也无法运行。 建议: 将两个测试类分别放入独立文件,并声明为 public class。移动后,默认的 public 无参构造即可满足 JUnit3 的基本实例化要求。 - 🔴 [AI] [bug]
multiple-top-level-classesL28 多个顶层类与 Java 文件结构冲突,main 入口不可用 本文件中的 JUnitSpellingTest 是 public 类,因此文件必须命名为 JUnitSpellingTest.java。Junit3Main 无法在同一文件中声明为 public,导致其 main 方法不能作为程序入口;同时 JUnitStaticSuiteTest 和 DetachedTest 不是 public,JUnit3 无法从外部包加载它们。这种多顶层类布局会造成测试被静默忽略、程序无法启动。 建议: 将 Junit3Main 移到独立文件并声明为 public class Junit3Main;将 JUnitStaticSuiteTest、DetachedTest 也分别移到独立文件并声明为 public class。如果使用 JUnit5,则无需继承 TestCase,文件结构更简单。 - 🟡 [AI] [design]
empty-test-suiteL24 测试类没有真实断言,测试套件可能空转 JUnitSpellingTest 没有任何 test 方法;JUnitStaticSuiteTest 只有无效的 suite() 且没有测试方法;DetachedTest.testSomething() 没有断言。这些测试即使全部通过也不能验证任何行为,容易让 CI 产生假阳性。 建议: 为每个测试类添加带断言的 test 方法;若某个类只是测试基类,则不应继承 TestCase。使用 JUnit5 的 @Test 和 Assertions 能更容易写出有效测试。 - 🔵 [AI] [design]
legacy-junit3L6 使用已停止维护的 JUnit3 测试框架 代码通过继承 junit.framework.TestCase 和 test 前缀编写测试,属于 JUnit3 风格。JUnit3 不支持现代测试特性(如异常断言、参数化测试、嵌套测试),不利于长期维护。 建议: 迁移到 JUnit4 或 JUnit5:移除 extends TestCase,测试方法加 @Test 注解,使用 org.junit.jupiter.api.Assertions 断言。迁移前至少先修复类可见性和空测试问题。 - 🔵 [AI] [style]
abbreviation-in-nameL28 类名 Junit3Main 中 JUnit 缩写大小写不规范 JUnit 是一个品牌名,通常缩写应保持全部大写。Junit3Main 看起来像类名大小写不规范,建议改为 JUnit3Main,并同步更新文件名和所有引用。 建议: 将 Junit3Main 重命名为 JUnit3Main,更新文件名为 JUnit3Main.java,并修改 main 方法中 Logger.getLogger(Junit3Main.class.getName()) 的类名引用。