diff --git a/its/autoscan/src/test/resources/autoscan/diffs/diff_S2699.json b/its/autoscan/src/test/resources/autoscan/diffs/diff_S2699.json
index ce6b9db1c45..998602e4cec 100644
--- a/its/autoscan/src/test/resources/autoscan/diffs/diff_S2699.json
+++ b/its/autoscan/src/test/resources/autoscan/diffs/diff_S2699.json
@@ -1,6 +1,6 @@
{
"ruleKey": "S2699",
"hasTruePositives": true,
- "falseNegatives": 157,
+ "falseNegatives": 158,
"falsePositives": 1
}
diff --git a/java-checks-test-sources/default/pom.xml b/java-checks-test-sources/default/pom.xml
index dded3d0343a..8da45f87738 100644
--- a/java-checks-test-sources/default/pom.xml
+++ b/java-checks-test-sources/default/pom.xml
@@ -1016,6 +1016,12 @@
junit-platform-suite
provided
+
+ org.approvej
+ core
+ 1.6.0
+ test
+
diff --git a/java-checks-test-sources/default/src/test/java/checks/tests/AssertionsInTestsCheck/ApproveJ.java b/java-checks-test-sources/default/src/test/java/checks/tests/AssertionsInTestsCheck/ApproveJ.java
new file mode 100644
index 00000000000..e7e0987e600
--- /dev/null
+++ b/java-checks-test-sources/default/src/test/java/checks/tests/AssertionsInTestsCheck/ApproveJ.java
@@ -0,0 +1,32 @@
+package checks.tests.AssertionsInTestsCheck;
+
+import java.time.LocalDate;
+import org.junit.jupiter.api.Test;
+
+import static org.approvej.ApprovalBuilder.approve;
+import static org.approvej.print.MultiLineStringPrintFormat.multiLineString;
+
+class ApproveJTest {
+
+ @Test
+ void contains_no_assertions() { // Noncompliant
+ }
+
+ public String hello() {return "hello";}
+
+ @Test
+ void approve_string() {
+ String result = hello();
+ approve(result)
+ .byFile();
+ }
+
+ public record Person(String name, LocalDate birthDate) {}
+
+ @Test
+ void approve_person() {
+ Person jane = new Person("Jane Doe", LocalDate.of(1990, 1, 1));
+ approve(jane).named("jane").printedAs(multiLineString()).byFile();
+ }
+
+}
diff --git a/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java b/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java
index c3df052ded2..cc1444a8e2c 100644
--- a/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java
+++ b/java-checks/src/main/java/org/sonar/java/checks/helpers/UnitTestUtils.java
@@ -41,7 +41,7 @@ public final class UnitTestUtils {
private static final String ORG_JUNIT_TEST = "org.junit.Test";
public static final Pattern ASSERTION_METHODS_PATTERN = Pattern.compile(
- "(assert|verify|fail|should|check|expect|validate|andExpect).*" +
+ "(assert|verify|fail|should|check|expect|validate|andExpect|approve).*" +
// Eclipse Vert.x with JUnit 5 (VertxTestContext)
"|laxCheckpoint|succeedingThenComplete");
private static final Pattern TEST_METHODS_PATTERN = Pattern.compile("test.*|.*Test");
diff --git a/java-checks/src/test/java/org/sonar/java/checks/tests/AssertionsInTestsCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/tests/AssertionsInTestsCheckTest.java
index 590363b3eda..e54a82a2b61 100644
--- a/java-checks/src/test/java/org/sonar/java/checks/tests/AssertionsInTestsCheckTest.java
+++ b/java-checks/src/test/java/org/sonar/java/checks/tests/AssertionsInTestsCheckTest.java
@@ -64,6 +64,7 @@ void setup() {
"JMockit",
"Awaitility",
"AssertJ",
+ "ApproveJ",
"Custom"
})
void test(String framework) {
diff --git a/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S2699.html b/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S2699.html
index 19832c2b2aa..b567b1b2a32 100644
--- a/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S2699.html
+++ b/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S2699.html
@@ -3,6 +3,7 @@ Why is this an issue?
code under test.
This rule raises an exception when no assertions from any of the following known frameworks are found in a test:
+ - ApproveJ
- AssertJ
- Awaitility
- EasyMock