Правило PMD: слишком много статического импорта может привести к беспорядку в коде в unitTest не нарушается

У меня есть сомнения, у меня есть класс, в котором я использую другой статический импорт для констант импорта, моя проблема в том, что я получаю сообщение об ошибке: Too many static imports may lead to messy code. Но в модульном тесте похоже, что это неплохая практика. Например, в классе модульного теста я использую этот импорт с любой проблемой:

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;```

И наоборот, в моем классе:

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, чтобы выяснить настоящую причину этой проблемы. Есть подсказка?

Спасибо!


person rasilvap    schedule 04.10.2019    source источник
comment
Нет, нет. Это ошибка pmd.   -  person rasilvap    schedule 04.10.2019
comment
Правило имеет свойство maximumStaticImports, позволяющее установить, сколько будет слишком много. Настройте это значение по своему вкусу, в конце концов, это правило стиля кода. Прочтите документы здесь: pmd.github.io/pmd-6.18.0 /   -  person Johnco    schedule 05.10.2019
comment
В производственном коде (= не тестовом) код качество имеет вес немного больше, чем многословность. Я думаю, что текущие настройки исходят из импорта Assert. Выше нет ничего плохого в использовании квалифицированного HttpStatus.SAD_REQUEST, тем более что у вас все еще есть case SAD_REQUEST:.   -  person Joop Eggen    schedule 19.11.2019


Ответы (6)


Я использовал @SuppressWarnings ("PMD.TooManyStaticImports"), чтобы избежать этой проблемы в моем классе.

person rasilvap    schedule 05.10.2019
comment
Было бы неплохо уточнить, рекомендуется ли это решение - person darw; 26.05.2020
comment
Я бы предпочел не использовать это решение, так как оно должно быть введено в файлы gazillion ... лучше сделать это через исключение правил для всего проекта, чтобы у вас было только одно место для управления этим правилом вместо миллионы мест - person Dáve; 22.10.2020

Это кажется нежелательной конфигурацией или правилом PMD; особенно при тестировании такого рода статический импорт следует ожидать. Настройку PMD следует изменить, чтобы полностью отключить эту проверку или не применять ее к тестовому коду.

person chrylis -cautiouslyoptimistic-    schedule 04.10.2019

Прежде всего, наиболее вероятная причина, по которой PMD не жалуется на ваш тестовый класс, заключается в том, что он вообще не сканировал ваши тестовые классы. Если вы используете плагин maven pmd, вы можете настроить его на includeTests. См. Документы.

    <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, оно может быть субъективным и не обязательно подходит для всех вариантов использования или стилей кода. Вот почему говорится, что может привести к запутанному коду. Есть аргументы за и против его использования. < / а>

В общем, если вы хотите отключить правило для одного класса, вы можете использовать:

@SuppressWarnings("PMD.TooManyStaticImports")

В качестве альтернативы, если вы хотите настроить правило, вы можете указать свою собственную конфигурацию, например:

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

Хотя это не ответ на вопрос, это заставляет меня задуматься, может ли PMD иметь аннотацию, позволяющую пользователям переопределять конфигурации правил в одном или нескольких исходных файлах или даже в пакете? Единственная проблема заключается в том, что это приведет к появлению зависимости во время компиляции. Стоит ли оно того, если вводится на уровне пакета? Есть ли какие-то правила с таким коэффициентом раздражительности? На ум приходит Закон Деметры.

Что касается самого вопроса, используйте импорт звездочки для статического импорта, когда вы практически импортируете весь класс. Это менее многословно и менее некрасиво.

person fernal73    schedule 19.11.2019
comment
Это не дает ответа на вопрос. Вы можете поискать похожие вопросы или обратиться к связанным и связанным вопросам в правой части страницы, чтобы найти ответ. Если у вас есть связанный, но другой вопрос, задайте новый вопрос и включите ссылку на этот, чтобы помочь обеспечить контекст. См .: Задавайте вопросы, получайте ответы, не отвлекаясь - person Das_Geek; 19.11.2019
comment
Приятно знать. Я хотел добавить это в качестве комментария, но пока у меня нет смысла это делать. И мне не интересно накапливать очки только для того, чтобы я мог комментировать. Я удалил этот ответ, потому что понял, что аннотация SuppressWarnings работает достаточно хорошо. Нет никакой реальной необходимости добавлять заменяемую. Другой вариант - сохранить прогоны и попытаться использовать их в качестве обучающих данных, чтобы предложить изменение параметров правила. - person fernal73; 21.11.2019

На мой взгляд, все же лучше импортировать все статические данные явно и конкретно, потому что они загружаются быстрее, чем импорт всех (*), и одна из причин заключается в том, что мы предпочитаем явные вещи в Java.

Поэтому я рекомендую отключить эту проверку правил PMD.

Ваше здоровье.

person Quoc Truong    schedule 26.08.2020

Вы можете попробовать импортировать на один уровень выше.
Например, используйте Constant.MY_VAR вместо прямого использования MY_VAR. Таким образом, вам не нужно импортировать каждую переменную отдельно в Константу, вы можете просто импортировать Константу и получить доступ к переменной в коде с помощью Constant.MY_VAR.

person Vishal Sharma    schedule 23.06.2021