diff --git a/java-checks-test-sources/default/src/test/java/checks/tests/TooManyAssertionsCheckCustom2.java b/java-checks-test-sources/default/src/test/java/checks/tests/TooManyAssertionsCheckCustom2.java index aebd7b5ff5..41beb0419d 100644 --- a/java-checks-test-sources/default/src/test/java/checks/tests/TooManyAssertionsCheckCustom2.java +++ b/java-checks-test-sources/default/src/test/java/checks/tests/TooManyAssertionsCheckCustom2.java @@ -1,8 +1,10 @@ package checks.tests; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import rx.Observable; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.Assert.assertEquals; public class TooManyAssertionsCheckCustom2 { @@ -37,6 +39,35 @@ void test3() { // Noncompliant {{Refactor this method to reduce the number of as // ^^^^^^^^^^^^^^< } + @Test + void test4() { // Compliant, chained assertions only count as a single instance + var trueCondition = true; + var falseCondition = false; + + assertThat(trueCondition).isTrue().as("true").isTrue().describedAs("isTrue").isTrue(); + assertThat(falseCondition).isFalse().as("false").isFalse().describedAs("isFalse").isFalse(); + } + + @Test + void test5() { // Compliant, chained assertions only count as a single instance + var myObject = new Object(); + + Assertions.assertThat(myObject).as("someObject").isNotNull().withFailMessage("fail").isNotNull().overridingErrorMessage("error").isInstanceOf(Object.class); + } + + @Test + void test6() { // Noncompliant {{Refactor this method to reduce the number of assertions from 3 to less than 2.}} +// ^^^^^ + var myObject = new Object(); + + assertThat(myObject).as("description").isNotNull().describedAs("description").isNotNull(); +// ^^^^^^^^^^^^^^^^^^^^< + assertThat(myObject).describedAs("description").isNotNull(); +// ^^^^^^^^^^^^^^^^^^^^< + assertThat(myObject).withFailMessage("failure").describedAs("someObject").isNotNull(); +// ^^^^^^^^^^^^^^^^^^^^< + } + void customAssert() { assertEquals(2, f(2)); assertEquals(3, f(1)); diff --git a/java-checks/src/main/java/org/sonar/java/checks/tests/TooManyAssertionsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/tests/TooManyAssertionsCheck.java index ee8973f04e..e39fa4ad10 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/tests/TooManyAssertionsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/tests/TooManyAssertionsCheck.java @@ -111,15 +111,15 @@ private class AssertionsCounterVisitor extends BaseTreeVisitor { @Override public void visitMethodInvocation(MethodInvocationTree mit) { super.visitMethodInvocation(mit); - if (isAssertion(methodName(mit), mit.methodSymbol())) { - ExpressionTree methodSelect = mit.methodSelect(); - if (methodSelect.is(Tree.Kind.MEMBER_SELECT)) { - ExpressionTree expression = ((MemberSelectExpressionTree) methodSelect).expression(); - if (assertions.contains(expression) || chainedAssertions.contains(expression)) { - chainedAssertions.add(mit); - return; - } + ExpressionTree methodSelect = mit.methodSelect(); + if (methodSelect.is(Tree.Kind.MEMBER_SELECT)) { + ExpressionTree expression = ((MemberSelectExpressionTree) methodSelect).expression(); + if (assertions.contains(expression) || chainedAssertions.contains(expression)) { + chainedAssertions.add(mit); + return; } + } + if (isAssertion(methodName(mit), mit.methodSymbol())) { assertions.add(mit); } }