You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确重写Apex PMD默认规则适配自定义代码规范?

解决PMD Apex自定义方法命名规则的问题

核心问题分析

你遇到的重复规则警告是因为PMD不允许同一内置规则在规则集中重复定义(后定义的会覆盖前一个),同时未区分测试类与非测试类的适用范围,导致规则错误应用。以下是正确的实现方案:


完整规则集配置示例

<?xml version="1.0"?>
<ruleset name="CustomApexRules" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">

    <!-- 类名规则:保留默认TitleCase要求 -->
    <rule ref="category/apex/naming.xml/ClassNamingConventions" />

    <!-- 变量名规则:保留默认camelCase要求 -->
    <rule ref="category/apex/naming.xml/VariableNamingConventions" />

    <!-- 1. 非测试类方法命名规则:强制TitleCase,禁止测试方法 -->
    <rule name="NonTestClassMethodNaming" ref="category/apex/naming.xml/MethodNamingConventions">
        <description>非测试类的静态/实例方法必须使用TitleCase,禁止存在测试方法</description>
        <properties>
            <property name="staticPattern" value="^[A-Z][a-zA-Z0-9]*$" />
            <property name="instancePattern" value="^[A-Z][a-zA-Z0-9]*$" />
            <!-- 非测试类不允许有测试方法,设置无效正则,匹配到即报错 -->
            <property name="testPattern" value="^$" />
        </properties>
        <!-- 仅应用于非测试类 -->
        <when>
            <![CDATA[!nodeIs('Class') or not nodeHasAnnotation('isTest')]]>
        </when>
    </rule>

    <!-- 2. 测试类方法命名规则:普通方法TitleCase,测试方法符合testXXX_expectYYY格式 -->
    <rule name="TestClassMethodNaming" ref="category/apex/naming.xml/MethodNamingConventions">
        <description>测试类的普通方法使用TitleCase,测试方法必须遵循testXXX_expectYYY格式</description>
        <properties>
            <property name="staticPattern" value="^[A-Z][a-zA-Z0-9]*$" />
            <property name="instancePattern" value="^[A-Z][a-zA-Z0-9]*$" />
            <!-- 测试方法正则:以test开头,包含_expect,后续允许字母数字下划线 -->
            <property name="testPattern" value="^test[A-Z][a-zA-Z0-9]*_expect[A-Za-z0-9_]*$" />
        </properties>
        <!-- 仅应用于带@isTest注解的类 -->
        <when>
            <![CDATA[nodeIs('Class') and nodeHasAnnotation('isTest')]]>
        </when>
    </rule>

    <!-- 可选:明确禁止非测试类中出现@Test方法 -->
    <rule ref="category/apex/bestpractices.xml/TestMethodsInNonTestClasses" />
</ruleset>

关键说明

  1. 避免规则重复覆盖:给每个规则实例设置唯一的name属性,结合<when>条件限定适用范围,让不同配置分别作用于测试类和非测试类,解决PMD的重复规则警告。
  2. 测试方法规则精准匹配:通过正则^test[A-Z][a-zA-Z0-9]*_expect[A-Za-z0-9_]*$严格约束测试方法命名格式,确保符合testCreateAccount_expectSuccessfulInsert()这类规范。
  3. 非测试类防护:通过设置testPattern="^$",强制非测试类中不能存在@Test方法,一旦出现直接触发违规提示。

内容的提问来源于stack exchange,提问作者JimmE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:32:40