You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by ni...@apache.org on 2022/06/03 08:25:27 UTC

[pulsar] branch master updated: [fix][ci] Fix tests memory leak due to mockito-inline (#15513)

This is an automated email from the ASF dual-hosted git repository.

nicoloboschi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 14b95ecc45f [fix][ci] Fix tests memory leak due to mockito-inline (#15513)
14b95ecc45f is described below

commit 14b95ecc45f73543fac1385a57fac8b6feeb2f5e
Author: Nicolò Boschi <bo...@gmail.com>
AuthorDate: Fri Jun 3 10:25:13 2022 +0200

    [fix][ci] Fix tests memory leak due to mockito-inline (#15513)
---
 buildtools/pom.xml                                    | 11 +++++++++++
 .../apache/pulsar/tests/MockitoCleanupListener.java   | 19 ++++++++++++++++---
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/buildtools/pom.xml b/buildtools/pom.xml
index 1a3ecb42c9c..d44f5e58a16 100644
--- a/buildtools/pom.xml
+++ b/buildtools/pom.xml
@@ -50,6 +50,7 @@
     <guava.version>31.0.1-jre</guava.version>
     <ant.version>1.10.12</ant.version>
     <snakeyaml.version>1.30</snakeyaml.version>
+    <mockito.version>3.12.4</mockito.version>
     <!-- required for running tests on JDK11+ -->
     <test.additional.args>
       --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
@@ -141,6 +142,16 @@
       <version>4.1.77.Final</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <version>${mockito.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-inline</artifactId>
+      <version>${mockito.version}</version>
+    </dependency>
   </dependencies>
 
   <build>
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 354a55c10e3..73fff1bb7e2 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 <a href="https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#47"}>
+     *     mockito docs</a>.
+     */
+    private void cleanupMockitoInline() {
+        Mockito.framework().clearInlineMocks();
+    }
+
 }