1
2
3
4
5 package com.qulice.pmd.rules;
6
7 import java.util.Set;
8 import net.sourceforge.pmd.lang.java.ast.ASTBlock;
9 import net.sourceforge.pmd.lang.java.ast.ASTMethodCall;
10 import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
11 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRulechainRule;
12 import net.sourceforge.pmd.lang.java.rule.internal.TestFrameworksUtil;
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 public final class UnitTestContainsTooManyAssertsRule
31 extends AbstractJavaRulechainRule {
32
33
34
35
36
37
38 private static final Set<String> ASSERTIONS = Set.of(
39 "assertThat",
40 "assertEquals",
41 "assertNotEquals",
42 "assertTrue",
43 "assertFalse",
44 "assertNull",
45 "assertNotNull",
46 "assertSame",
47 "assertNotSame",
48 "assertArrayEquals",
49 "assertIterableEquals",
50 "assertLinesMatch",
51 "assertDoesNotThrow",
52 "assertTimeout",
53 "assertTimeoutPreemptively",
54 "assertAll",
55 "fail"
56 );
57
58
59
60
61 public UnitTestContainsTooManyAssertsRule() {
62 super(ASTMethodDeclaration.class);
63 }
64
65 @Override
66 public Object visit(final ASTMethodDeclaration method, final Object data) {
67 final ASTBlock body = method.getBody();
68 if (body != null
69 && TestFrameworksUtil.isTestMethod(method)
70 && body.descendants(ASTMethodCall.class)
71 .filter(UnitTestContainsTooManyAssertsRule::isCountedAssert)
72 .count() > 1) {
73 this.asCtx(data).addViolation(method);
74 }
75 return data;
76 }
77
78 private static boolean isCountedAssert(final ASTMethodCall call) {
79 return UnitTestContainsTooManyAssertsRule.ASSERTIONS.contains(
80 call.getMethodName()
81 );
82 }
83 }