diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestContainsTooManyAssertsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestContainsTooManyAssertsRule.java index 08a0b3bc8c..ea69712b37 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestContainsTooManyAssertsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestContainsTooManyAssertsRule.java @@ -13,6 +13,8 @@ import net.sourceforge.pmd.properties.NumericConstraints; import net.sourceforge.pmd.properties.PropertyDescriptor; import net.sourceforge.pmd.properties.PropertyFactory; +import java.util.List; + public class JUnitTestContainsTooManyAssertsRule extends AbstractJavaRulechainRule { private static final PropertyDescriptor MAX_ASSERTS = @@ -22,10 +24,17 @@ public class JUnitTestContainsTooManyAssertsRule extends AbstractJavaRulechainRu .defaultValue(1) .build(); + private static final PropertyDescriptor> EXTRA_ASSERT_METHOD_NAMES = + PropertyFactory.stringListProperty("extraAssertMethodNames") + .desc("Extra valid assertion methods names") + .emptyDefaultValue() + .build(); + public JUnitTestContainsTooManyAssertsRule() { super(ASTMethodDeclaration.class); definePropertyDescriptor(MAX_ASSERTS); + definePropertyDescriptor(EXTRA_ASSERT_METHOD_NAMES); } @Override @@ -33,7 +42,7 @@ public class JUnitTestContainsTooManyAssertsRule extends AbstractJavaRulechainRu ASTBlock body = method.getBody(); if (body != null && TestFrameworksUtil.isTestMethod(method)) { int assertCount = body.descendants(ASTMethodCall.class) - .filter(TestFrameworksUtil::isProbableAssertCall) + .filter(call -> TestFrameworksUtil.isProbableAssertCall(call, getProperty(EXTRA_ASSERT_METHOD_NAMES))) .count(); if (assertCount > getProperty(MAX_ASSERTS)) { asCtx(data).addViolation(method); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestsShouldIncludeAssertRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestsShouldIncludeAssertRule.java index 447f462052..968534b5f1 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestsShouldIncludeAssertRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestsShouldIncludeAssertRule.java @@ -9,22 +9,32 @@ import net.sourceforge.pmd.lang.java.ast.ASTMethodCall; import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration; import net.sourceforge.pmd.lang.java.rule.AbstractJavaRulechainRule; import net.sourceforge.pmd.lang.java.rule.internal.TestFrameworksUtil; +import net.sourceforge.pmd.properties.PropertyDescriptor; +import net.sourceforge.pmd.properties.PropertyFactory; + +import java.util.List; public class JUnitTestsShouldIncludeAssertRule extends AbstractJavaRulechainRule { + private static final PropertyDescriptor> EXTRA_ASSERT_METHOD_NAMES = + PropertyFactory.stringListProperty("extraAssertMethodNames") + .desc("Extra valid assertion methods names") + .emptyDefaultValue() + .build(); public JUnitTestsShouldIncludeAssertRule() { super(ASTMethodDeclaration.class); + definePropertyDescriptor(EXTRA_ASSERT_METHOD_NAMES); } @Override public Object visit(ASTMethodDeclaration method, Object data) { ASTBlock body = method.getBody(); if (body != null - && TestFrameworksUtil.isTestMethod(method) - && !TestFrameworksUtil.isExpectAnnotated(method) - && body.descendants(ASTMethodCall.class) - .none(TestFrameworksUtil::isProbableAssertCall)) { + && TestFrameworksUtil.isTestMethod(method) + && !TestFrameworksUtil.isExpectAnnotated(method) + && body.descendants(ASTMethodCall.class) + .none(call -> TestFrameworksUtil.isProbableAssertCall(call, getProperty(EXTRA_ASSERT_METHOD_NAMES)))) { asCtx(data).addViolation(method); } return data; diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/internal/TestFrameworksUtil.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/internal/TestFrameworksUtil.java index cbb4c83810..dce37c8c04 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/internal/TestFrameworksUtil.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/internal/TestFrameworksUtil.java @@ -6,6 +6,7 @@ package net.sourceforge.pmd.lang.java.rule.internal; import static net.sourceforge.pmd.util.CollectionUtil.setOf; +import java.util.List; import java.util.Set; import net.sourceforge.pmd.lang.java.ast.ASTAnnotation; @@ -170,14 +171,15 @@ public final class TestFrameworksUtil { || TypeTestUtil.isA("junit.framework.Assert", declaring)); } - public static boolean isProbableAssertCall(ASTMethodCall call) { + public static boolean isProbableAssertCall(ASTMethodCall call, List extraAssertMethodNames) { String name = call.getMethodName(); return name.startsWith("assert") && !isSoftAssert(call) - || name.startsWith("check") - || name.startsWith("verify") - || "fail".equals(name) - || "failWith".equals(name) - || isExpectExceptionCall(call); + || name.startsWith("check") + || name.startsWith("verify") + || "fail".equals(name) + || "failWith".equals(name) + || extraAssertMethodNames.stream().anyMatch(name::startsWith) + || isExpectExceptionCall(call); } private static boolean isSoftAssert(ASTMethodCall call) { diff --git a/pmd-java/src/main/resources/category/java/bestpractices.xml b/pmd-java/src/main/resources/category/java/bestpractices.xml index 03ed6fd517..b91266e1f5 100644 --- a/pmd-java/src/main/resources/category/java/bestpractices.xml +++ b/pmd-java/src/main/resources/category/java/bestpractices.xml @@ -914,6 +914,10 @@ Customize the maximum number of assertions used by this Rule to suit your needs. This rule checks for JUnit4, JUnit5 and TestNG Tests, as well as methods starting with "test". 3 + + + 3 + + +