diff options
author | Felipe Leme <felipeal@google.com> | 2024-01-26 14:21:18 -0800 |
---|---|---|
committer | Felipe Leme <felipeal@google.com> | 2024-01-29 18:33:15 +0000 |
commit | 2982d1e4951883dea75847910feedbb852a4a2b1 (patch) | |
tree | 7e9f5ae3e621bf35333c6a2870f04cc453bf107f | |
parent | fb1f9e9ccd2c2ae32326c74346cb33d7f925190a (diff) | |
download | mockito-2982d1e4951883dea75847910feedbb852a4a2b1.tar.gz |
Fixed DefaultMockitoSession constructor.
It was not removing the UniversalTestListener when initmocks()
failed, which would cause subsequent tests to fail because they could
not start a new session.
To test it, run the following command in a pristine device running
Android TM (without an updated adservices apk) - a lot of tests will
fail due to missing classes and methods.
$ atest AdServicesServiceCoreUnitTests 2>&1 | tee ~/tmp/log.txt && grep "Unfinished mocking session" ~/tmp/log.txt | wc
Without this patch, it would return ~216 occurrences; with it, it's 0.
Test: manual verification (see above)
Bug: 322415729
Change-Id: I14ed7c032a974c3a65caaf091d36d9667ea331b6
-rw-r--r-- | README.version | 1 | ||||
-rw-r--r-- | src/main/java/org/mockito/internal/framework/DefaultMockitoSession.java | 21 |
2 files changed, 20 insertions, 2 deletions
diff --git a/README.version b/README.version index 33436a1..1a82721 100644 --- a/README.version +++ b/README.version @@ -9,4 +9,5 @@ Dexmaker module. 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 @@ public class DefaultMockitoSession implements MockitoSession { } 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; } } |