Merge "Fixed DefaultMockitoSession constructor." into main
diff --git a/README.version b/README.version
index 33436a1..1a82721 100644
--- a/README.version
+++ b/README.version
@@ -9,4 +9,5 @@
 The source can be updated using the update_source.sh script.
 
 Local Modifications:
+         Fixed DefaultMockitoSession constructor. (I14ed7c032a974c3a65caaf091d36d9667ea331b6)
          New API to clean up all inline mocks after test (8bdfbf053ab6e4fc14a3eaecb613f5838fdf0f09)
diff --git a/src/main/java/org/mockito/internal/framework/DefaultMockitoSession.java b/src/main/java/org/mockito/internal/framework/DefaultMockitoSession.java
index c900bf7..c81baf2 100644
--- a/src/main/java/org/mockito/internal/framework/DefaultMockitoSession.java
+++ b/src/main/java/org/mockito/internal/framework/DefaultMockitoSession.java
@@ -32,8 +32,25 @@
         } catch (RedundantListenerException e) {
             Reporter.unfinishedMockingSession();
         }
-        for (Object testClassInstance : testClassInstances) {
-            MockitoAnnotations.initMocks(testClassInstance);
+        try {
+            for (Object testClassInstance : testClassInstances) {
+                MockitoAnnotations.initMocks(testClassInstance);
+            }
+        } catch (RuntimeException | Error e) {
+            try {
+                // TODO: ideally this scenario should be tested on DefaultMockitoSessionBuilderTest,
+                // but we don't have any Android.bp project to run it.
+                // Besides, the latest Mockito code (https://github.com/mockito/mockito/blob/main/src/main/java/org/mockito/internal/framework/DefaultMockitoSession.java
+                // at the time this patch was merged) has a different workflow, where the listener
+                // is marked as dirty when an exception is thrown, so we're forking the solution.
+                Mockito.framework().removeListener(listener);
+            } catch (RuntimeException | Error e2) {
+                // Ignore it, as the real failure is e, thrown at the end
+                System.err.println("DefaultMockitoSession: ignoring exception thrown when removing "
+                        + "listener " + listener);
+                e2.printStackTrace(System.err);
+            }
+            throw e;
         }
     }