pmd规则:静态导入过多可能导致代码乱码 未违反unitTest

Pmd rule: Too many static imports may lead to messy code in unitTest is not violated

我有疑问,我有一个 class,其中我对导入常量使用不同的静态导入,我的问题是我收到错误消息:Too many static imports may lead to messy code。但在单元测试中,这似乎不是一个坏习惯。例如,在单元测试 class 中,我使用此导入遇到任何问题:

import static com.rccl.middleware.kidsclub.engine.web.controller.KidController.KID_FIND_PATH;
import static com.rccl.middleware.kidsclub.engine.web.controller.KidController.KID_LIST_PATH;
import static com.rccl.middleware.kidsclub.engine.web.controller.KidController.KID_PATH;
import static com.rccl.middleware.kidsclub.engine.web.controller.KidController.KID_REGISTER_ALL_PATH;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.times;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.request;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;```

相反在我的 class:

import static org.springframework.http.HttpStatus.BAD_REQUEST;
import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
import static org.springframework.http.HttpStatus.NOT_FOUND;
import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY;

这些导入给我带来了问题,我收到了错误消息:静态导入过多可能会导致代码混乱。我不太清楚为什么。

我无法访问 pmd 文件以找出此问题的真正原因。有什么线索吗?

谢谢!

这似乎是令人反感的 PMD 配置或规则; 尤其是 在测试中,这种静态导入是可以预料的。应更改 PMD 设置以完全禁用此检查或不将其应用于测试代码。

我在 class.

中使用了 @SuppressWarnings("PMD.TooManyStaticImports") 来避免这个问题

虽然这不是问题的答案,但它确实让我想知道 PMD 是否可以有一个注释,允许用户覆盖一个或多个源文件甚至包中的规则配置? 唯一的问题是这会引入编译时依赖性。如果在包级别引入,是否值得?那种暴躁商数有什么规定吗?想到得墨忒耳法则。

至于问题本身,当您实际导入整个 class 时,使用星号导入进行静态导入。它不那么冗长,也不那么丑陋。

对我来说,显式和具体地导入所有静态仍然更好,因为它比导入所有 (*) 更快加载,原因之一是我们更喜欢Java.

中的显式 事物

因此,我建议禁用此 PMD 规则检查。

干杯。

首先,PMD 没有抱怨您的测试 class 的最可能原因是它根本没有扫描您的测试 classes。如果您使用的是 maven pmd 插件,您可以将其配置为 includeTests。参见 Docs

    <plugin>
        <artifactId>maven-pmd-plugin</artifactId>
        <executions>
            <execution>
                <phase>package</phase>
                    <goals>
                        <goal>check</goal>
                    </goals>
            </execution>
       </executions>
       <configuration>
           <rulesets>
               <ruleset>/my-custom-rules.xml</ruleset>  // Your own rules here
           </rulesets>
           <includeTests>true</includeTests> // Default value is false
       </configuration>
    </plugin>

关于 TooManyStaticImports 规则,就像任何其他 PMD 规则一样,它可能是主观的,不一定适合所有用例或代码风格。这就是为什么它说“可能 导致代码混乱”。 There are arguments for and against its usage.

一般来说,如果你想为一个 class 忽略一条规则,你可以使用:

@SuppressWarnings("PMD.TooManyStaticImports")

或者,如果您想要 fine-tune 规则,您可以提供您自己的自定义配置,例如:

<rule ref="category/java/codestyle.xml/TooManyStaticImports">
    <properties>
        <property name="maximumStaticImports" value="6" /> // Default is 4
    </properties>
</rule>

您可以尝试导入上一级。
例如,使用 Constant.MY_VAR 而不是直接使用 MY_VAR。所以你不必在 Constant 中单独导入每个变量,你可以只导入 Constant 并在代码中使用 Constant.MY_VAR.

访问变量

基本上这是不好的做法,因为您从另一个 Class 引用静态字段,在某种程度上您会从当前文件寻址静态 属性。要防止此 PMD 错误,您必须进行合格的调用。

而不是:

BAD_REQUEST;
INTERNAL_SERVER_ERROR;
NOT_FOUND;
UNPROCESSABLE_ENTITY;

通话:

HttpStatus.BAD_REQUEST;
HttpStatus.INTERNAL_SERVER_ERROR;
HttpStatus.NOT_FOUND;
HttpStatus.UNPROCESSABLE_ENTITY;