diff --git a/buildtools/pom.xml b/buildtools/pom.xml
index 77e607aeb3553..460d3d6c9f81a 100644
--- a/buildtools/pom.xml
+++ b/buildtools/pom.xml
@@ -50,6 +50,7 @@
31.0.1-jre
1.10.12
1.30
+ 3.12.4
--add-opens java.base/jdk.internal.loader=ALL-UNNAMED
@@ -141,6 +142,16 @@
4.1.76.Final
test
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+
+
+ org.mockito
+ mockito-inline
+ ${mockito.version}
+
diff --git a/buildtools/src/main/java/org/apache/pulsar/tests/MockitoCleanupListener.java b/buildtools/src/main/java/org/apache/pulsar/tests/MockitoCleanupListener.java
index 354a55c10e39f..73fff1bb7e269 100644
--- a/buildtools/src/main/java/org/apache/pulsar/tests/MockitoCleanupListener.java
+++ b/buildtools/src/main/java/org/apache/pulsar/tests/MockitoCleanupListener.java
@@ -18,6 +18,7 @@
*/
package org.apache.pulsar.tests;
+import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,10 +37,22 @@ public class MockitoCleanupListener extends BetweenTestClassesListenerAdapter {
@Override
protected void onBetweenTestClasses(Class> endedTestClass, Class> startedTestClass) {
- if (MOCKITO_CLEANUP_ENABLED && MockitoThreadLocalStateCleaner.INSTANCE.isEnabled()) {
- LOG.info("Cleaning up Mockito's ThreadSafeMockingProgress.MOCKING_PROGRESS_PROVIDER thread local state.");
- MockitoThreadLocalStateCleaner.INSTANCE.cleanup();
+ if (MOCKITO_CLEANUP_ENABLED) {
+ if (MockitoThreadLocalStateCleaner.INSTANCE.isEnabled()) {
+ LOG.info("Cleaning up Mockito's ThreadSafeMockingProgress.MOCKING_PROGRESS_PROVIDER thread local state.");
+ MockitoThreadLocalStateCleaner.INSTANCE.cleanup();
+ }
+ cleanupMockitoInline();
}
}
+ /**
+ * Mockito-inline can leak mocked objects, we need to clean up the inline mocks after every test.
+ * See
+ * mockito docs.
+ */
+ private void cleanupMockitoInline() {
+ Mockito.framework().clearInlineMocks();
+ }
+
}