View Javadoc
1   /*
2    * SPDX-FileCopyrightText: Copyright (c) 2011-2026 Yegor Bugayenko
3    * SPDX-License-Identifier: MIT
4    */
5   package com.qulice.pmd.rules;
6   
7   import java.util.Arrays;
8   import net.sourceforge.pmd.lang.java.ast.ASTAnnotation;
9   import net.sourceforge.pmd.lang.java.ast.ASTExpression;
10  import net.sourceforge.pmd.lang.java.ast.ASTImportDeclaration;
11  import net.sourceforge.pmd.lang.java.ast.ASTMethodCall;
12  import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
13  import net.sourceforge.pmd.lang.java.rule.AbstractJavaRulechainRule;
14  
15  /**
16   * Rule to check plain assertions in JUnit tests.
17   * @since 0.17
18   */
19  public final class ProhibitPlainJunitAssertionsRule
20      extends AbstractJavaRulechainRule {
21  
22      /**
23       * Mask of prohibited imports.
24       */
25      private static final String[] PROHIBITED = {
26          "org.junit.Assert.assert",
27          "junit.framework.Assert.assert",
28      };
29  
30      public ProhibitPlainJunitAssertionsRule() {
31          super(
32              ASTMethodDeclaration.class,
33              ASTImportDeclaration.class
34          );
35      }
36  
37      @Override
38      public Object visit(final ASTImportDeclaration imp, final Object data) {
39          if (Arrays.stream(ProhibitPlainJunitAssertionsRule.PROHIBITED)
40              .anyMatch(imp.getImportedName()::contains)
41          ) {
42              asCtx(data).addViolation(imp);
43          }
44          return data;
45      }
46  
47      @Override
48      public Object visit(final ASTMethodDeclaration method, final Object data) {
49          if (ProhibitPlainJunitAssertionsRule.isJUnitTest(method)) {
50              method.descendants(ASTMethodCall.class)
51                  .filter(ProhibitPlainJunitAssertionsRule::isPlainJunitAssert)
52                  .toStream()
53                  .findAny()
54                  .ifPresent(call -> asCtx(data).addViolation(method));
55          }
56          return data;
57      }
58  
59      private static boolean isJUnitTest(final ASTMethodDeclaration method) {
60          return method.getDeclaredAnnotations()
61              .toStream()
62              .map(ASTAnnotation::getSimpleName).anyMatch(
63                  name -> "Test".equals(name)
64                      || "org.junit.Test".equals(name)
65                      || "org.junit.jupiter.api.Test".equals(name)
66              );
67      }
68  
69      private static boolean isPlainJunitAssert(final ASTMethodCall call) {
70          final ASTExpression qualifier = call.getQualifier();
71          return call.getMethodName().startsWith("assert") && qualifier != null
72              && "Assert".contentEquals(qualifier.getText());
73      }
74  }