From f01f728d8e5a9f4580349743bb9476dfd8782d74 Mon Sep 17 00:00:00 2001 From: u7498708 Date: Sun, 29 Oct 2023 00:30:22 +1100 Subject: [PATCH 1/3] Working on Issue #3156, Adding MockitoMockedStatic and MockitoMockedStaticTest --- .../bugpatterns/MockitoMockedStatic.java | 35 +++++++++ .../bugpatterns/MockitoMockedStaticTest.java | 75 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 subprojects/errorprone/src/main/java/org/mockito/errorprone/bugpatterns/MockitoMockedStatic.java create mode 100644 subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java diff --git a/subprojects/errorprone/src/main/java/org/mockito/errorprone/bugpatterns/MockitoMockedStatic.java b/subprojects/errorprone/src/main/java/org/mockito/errorprone/bugpatterns/MockitoMockedStatic.java new file mode 100644 index 0000000000..d22e5258b0 --- /dev/null +++ b/subprojects/errorprone/src/main/java/org/mockito/errorprone/bugpatterns/MockitoMockedStatic.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2017 Mockito contributors + * This program is made available under the terms of the MIT License. + */ +package org.mockito.errorprone.bugpatterns; + +import com.google.auto.service.AutoService; +import com.google.errorprone.BugPattern; +import com.google.errorprone.BugPattern.SeverityLevel; +import com.google.errorprone.VisitorState; +import com.google.errorprone.bugpatterns.BugChecker; +import com.google.errorprone.bugpatterns.BugChecker.VariableTreeMatcher; +import com.google.errorprone.matchers.Description; +import com.sun.source.tree.VariableTree; + +@AutoService(BugChecker.class) +@BugPattern( + name = "MockitoMockedStatic", + summary = "Fields or parameters annotated with @Mock in MockedStatic can lead to compilation issues.", + explanation = "Fields or parameters annotated with @Mock in MockedStatic can lead to compilation issues.", + severity = SeverityLevel.ERROR) +public class MockitoMockedStatic extends BugChecker implements VariableTreeMatcher { + + @Override + public Description matchVariable(VariableTree tree, VisitorState state) { + if (tree.getModifiers().getAnnotations().stream() + .anyMatch(annotation -> + state.getSourceForNode(annotation).equals("@org.mockito.Mock") + && state.getSourceForNode(tree.getType()).equals("org.mockito.MockedStatic"))) { + return describeMatch(tree); + } + + return Description.NO_MATCH; + } +} diff --git a/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java b/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java new file mode 100644 index 0000000000..bd4bd3f589 --- /dev/null +++ b/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2017 Mockito contributors + * This program is made available under the terms of the MIT License. + */ +package org.mockito.errorprone.bugpatterns; + +import com.google.errorprone.CompilationTestHelper; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class MockitoMockedStaticTest { + + private CompilationTestHelper compilationTestHelper; + + @Before + public void setup() { + compilationTestHelper = + CompilationTestHelper.newInstance(MockitoMockedStatic.class, getClass()); + } + + @Test + public void mockedStaticWithMockField_shouldError() { + compilationTestHelper + .addSourceLines( + "input.java", + "import org.mockito.Mock;", + "import org.mockito.MockedStatic;", + "class Test {", + " @Mock", + " private Object mock;", + " public void test() {", + " try (MockedStatic mockedStatic = Mockito.mockStatic(Object.class)) {", + " // Do something with the mock", + " }", + " }", + "}") + .doTest(); + } + + @Test + public void mockedStaticWithMockParameter_shouldError() { + compilationTestHelper + .addSourceLines( + "input.java", + "import org.mockito.Mock;", + "import org.mockito.MockedStatic;", + "class Test {", + " public void test(@Mock Object mock) {", + " try (MockedStatic mockedStatic = Mockito.mockStatic(Object.class)) {", + " // Do something with the mock", + " }", + " }", + "}") + .doTest(); + } + + @Test + public void mockedStaticWithoutMock_shouldNotError() { + compilationTestHelper + .addSourceLines( + "input.java", + "import org.mockito.MockedStatic;", + "class Test {", + " public void test() {", + " try (MockedStatic mockedStatic = Mockito.mockStatic(Object.class)) {", + " // Do something without a mock", + " }", + " }", + "}") + .doTest(); + } +} \ No newline at end of file From e002269e26951882f605a8a6293288250bb776dc Mon Sep 17 00:00:00 2001 From: u7498708 Date: Sun, 29 Oct 2023 21:49:50 +1100 Subject: [PATCH 2/3] Added "import org.mockito.Mockito" to MockitoMockedStaticTest.java --- .../errorprone/bugpatterns/MockitoMockedStaticTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java b/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java index bd4bd3f589..ce57d72c05 100644 --- a/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java +++ b/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java @@ -28,6 +28,7 @@ public void mockedStaticWithMockField_shouldError() { "input.java", "import org.mockito.Mock;", "import org.mockito.MockedStatic;", + "import org.mockito.Mockito", "class Test {", " @Mock", " private Object mock;", @@ -47,6 +48,7 @@ public void mockedStaticWithMockParameter_shouldError() { "input.java", "import org.mockito.Mock;", "import org.mockito.MockedStatic;", + "import org.mockito.Mockito", "class Test {", " public void test(@Mock Object mock) {", " try (MockedStatic mockedStatic = Mockito.mockStatic(Object.class)) {", @@ -63,6 +65,7 @@ public void mockedStaticWithoutMock_shouldNotError() { .addSourceLines( "input.java", "import org.mockito.MockedStatic;", + "import org.mockito.Mockito", "class Test {", " public void test() {", " try (MockedStatic mockedStatic = Mockito.mockStatic(Object.class)) {", @@ -72,4 +75,4 @@ public void mockedStaticWithoutMock_shouldNotError() { "}") .doTest(); } -} \ No newline at end of file +} From 1abffcc33e24e86cf5722c27c0763c398f7364cb Mon Sep 17 00:00:00 2001 From: u7498708 Date: Sun, 29 Oct 2023 21:52:25 +1100 Subject: [PATCH 3/3] Made the rookie mistake of forgetting semi-colon --- .../errorprone/bugpatterns/MockitoMockedStaticTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java b/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java index ce57d72c05..44aa8d7c9f 100644 --- a/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java +++ b/subprojects/errorprone/src/test/java/org/mockito/errorprone/bugpatterns/MockitoMockedStaticTest.java @@ -28,7 +28,7 @@ public void mockedStaticWithMockField_shouldError() { "input.java", "import org.mockito.Mock;", "import org.mockito.MockedStatic;", - "import org.mockito.Mockito", + "import org.mockito.Mockito;", "class Test {", " @Mock", " private Object mock;", @@ -48,7 +48,7 @@ public void mockedStaticWithMockParameter_shouldError() { "input.java", "import org.mockito.Mock;", "import org.mockito.MockedStatic;", - "import org.mockito.Mockito", + "import org.mockito.Mockito;", "class Test {", " public void test(@Mock Object mock) {", " try (MockedStatic mockedStatic = Mockito.mockStatic(Object.class)) {", @@ -65,7 +65,7 @@ public void mockedStaticWithoutMock_shouldNotError() { .addSourceLines( "input.java", "import org.mockito.MockedStatic;", - "import org.mockito.Mockito", + "import org.mockito.Mockito;", "class Test {", " public void test() {", " try (MockedStatic mockedStatic = Mockito.mockStatic(Object.class)) {",