diff --git a/build.gradle b/build.gradle
index 7e90ffb..f6f3ee9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -4,7 +4,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:8.10.0'
+ classpath 'com.android.tools.build:gradle:8.13.2'
}
}
diff --git a/dexmaker-mockito-inline-extended-tests/build.gradle b/dexmaker-mockito-inline-extended-tests/build.gradle
index f77c080..d76a84f 100644
--- a/dexmaker-mockito-inline-extended-tests/build.gradle
+++ b/dexmaker-mockito-inline-extended-tests/build.gradle
@@ -30,5 +30,5 @@ dependencies {
androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test:rules:1.4.0'
- androidTestImplementation 'org.mockito:mockito-core:2.28.2', { exclude group: 'net.bytebuddy' }
+ androidTestImplementation libs.mockito.core, { exclude group: 'net.bytebuddy' }
}
diff --git a/dexmaker-mockito-inline-extended-tests/src/androidTest/AndroidManifest.xml b/dexmaker-mockito-inline-extended-tests/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..ec08df4
--- /dev/null
+++ b/dexmaker-mockito-inline-extended-tests/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/MockStatic.java b/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/MockStatic.java
index 95a9baa..9fe2ea0 100644
--- a/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/MockStatic.java
+++ b/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/MockStatic.java
@@ -25,7 +25,7 @@
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.staticMockMarker;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyZeroInteractions;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyNoInteractions;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
import static org.junit.Assert.assertEquals;
@@ -401,7 +401,7 @@ public void clearInvocationsRemovedInvocations() throws Exception {
try {
SuperClass.returnB();
clearInvocations(staticMockMarker(SuperClass.class));
- verifyZeroInteractions(staticMockMarker(SuperClass.class));
+ verifyNoInteractions(staticMockMarker(SuperClass.class));
} finally {
session.finishMocking();
}
diff --git a/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/StaticMockitoSessionVsMockitoJUnitRunner.java b/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/StaticMockitoSessionVsMockitoJUnitRunner.java
index fe75755..e2209b3 100644
--- a/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/StaticMockitoSessionVsMockitoJUnitRunner.java
+++ b/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/StaticMockitoSessionVsMockitoJUnitRunner.java
@@ -20,7 +20,7 @@
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
-@RunWith(MockitoJUnitRunner.class)
+@RunWith(MockitoJUnitRunner.Silent.class)
public class StaticMockitoSessionVsMockitoJUnitRunner {
@Test
public void simpleStubbing() throws Exception {
diff --git a/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/VerifyStatic.java b/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/VerifyStatic.java
index afb1439..6496ec4 100644
--- a/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/VerifyStatic.java
+++ b/dexmaker-mockito-inline-extended-tests/src/androidTest/java/com/android/dx/mockito/inline/extended/tests/VerifyStatic.java
@@ -30,7 +30,7 @@
import static com.android.dx.mockito.inline.extended.ExtendedMockito.staticMockMarker;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyNoMoreInteractions;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyZeroInteractions;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyNoInteractions;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
@@ -180,7 +180,7 @@ public void zeroInvocationsThrowsIfThereWasAnInvocation() throws Exception {
MockitoSession session = mockitoSession().mockStatic(EchoClass.class).startMocking();
try {
EchoClass.echo("marco!");
- verifyZeroInteractions(staticMockMarker(EchoClass.class));
+ verifyNoInteractions(staticMockMarker(EchoClass.class));
fail();
} finally {
session.finishMocking();
diff --git a/dexmaker-mockito-inline-extended-tests/src/main/AndroidManifest.xml b/dexmaker-mockito-inline-extended-tests/src/main/AndroidManifest.xml
index d9e9b95..a5ee3a1 100644
--- a/dexmaker-mockito-inline-extended-tests/src/main/AndroidManifest.xml
+++ b/dexmaker-mockito-inline-extended-tests/src/main/AndroidManifest.xml
@@ -3,7 +3,5 @@
xmlns:tools="http://schemas.android.com/tools">
-
-
+ tools:ignore="HardcodedDebugMode" />
diff --git a/dexmaker-mockito-inline-extended/build.gradle b/dexmaker-mockito-inline-extended/build.gradle
index e0182ed..bf59f95 100644
--- a/dexmaker-mockito-inline-extended/build.gradle
+++ b/dexmaker-mockito-inline-extended/build.gradle
@@ -46,5 +46,5 @@ dependencies {
implementation project(':dexmaker-mockito-inline')
- api 'org.mockito:mockito-core:2.28.2', { exclude group: 'net.bytebuddy' }
+ api libs.mockito.core, { exclude group: 'net.bytebuddy' }
}
diff --git a/dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/extended/StaticInOrder.java b/dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/extended/StaticInOrder.java
index 312a454..7950379 100644
--- a/dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/extended/StaticInOrder.java
+++ b/dexmaker-mockito-inline-extended/src/main/java/com/android/dx/mockito/inline/extended/StaticInOrder.java
@@ -17,6 +17,7 @@
package com.android.dx.mockito.inline.extended;
import org.mockito.InOrder;
+import org.mockito.MockedStatic;
import org.mockito.Mockito;
import org.mockito.verification.VerificationMode;
@@ -141,6 +142,12 @@ public void verify(MockedMethod method, VerificationMode mode) {
verify((MockedVoidMethod) method::get, mode);
}
+ @Override
+ public void verify(MockedStatic> mockedStatic, MockedStatic.Verification verification,
+ VerificationMode mode) {
+ instanceInOrder.verify(mockedStatic, verification, mode);
+ }
+
@Override
public void verifyNoMoreInteractions() {
instanceInOrder.verifyNoMoreInteractions();
diff --git a/dexmaker-mockito-inline-tests/build.gradle b/dexmaker-mockito-inline-tests/build.gradle
index 7beaf71..30b3208 100644
--- a/dexmaker-mockito-inline-tests/build.gradle
+++ b/dexmaker-mockito-inline-tests/build.gradle
@@ -30,5 +30,5 @@ dependencies {
androidTestImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test:runner:1.4.0'
- androidTestImplementation 'org.mockito:mockito-core:2.28.2', { exclude group: 'net.bytebuddy' }
+ androidTestImplementation libs.mockito.core, { exclude group: 'net.bytebuddy' }
}
diff --git a/dexmaker-mockito-inline-tests/src/androidTest/java/com/android/dx/mockito/inline/tests/MockSingleton.java b/dexmaker-mockito-inline-tests/src/androidTest/java/com/android/dx/mockito/inline/tests/MockSingleton.java
new file mode 100644
index 0000000..55a2fa1
--- /dev/null
+++ b/dexmaker-mockito-inline-tests/src/androidTest/java/com/android/dx/mockito/inline/tests/MockSingleton.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dx.mockito.inline.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.mockSingleton;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockedSingleton;
+
+@RunWith(AndroidJUnit4.class)
+public class MockSingleton {
+
+ enum SingleEnum {
+ VALUE_A {
+ @Override
+ String greeting() {
+ return "hello";
+ }
+ },
+ VALUE_B {
+ @Override
+ String greeting() {
+ return "world";
+ }
+ };
+
+ abstract String greeting();
+
+ int compute(int x) {
+ return x + 1;
+ }
+ }
+
+ static class SimpleSingleton {
+ static final SimpleSingleton INSTANCE = new SimpleSingleton();
+
+ String getValue() {
+ return "original";
+ }
+
+ int add(int a, int b) {
+ return a + b;
+ }
+ }
+
+ @Test
+ public void mockEnumSingleton() {
+ assertEquals("hello", SingleEnum.VALUE_A.greeting());
+
+ try (MockedSingleton mocked = mockSingleton(SingleEnum.VALUE_A)) {
+ when(SingleEnum.VALUE_A.greeting()).thenReturn("mocked");
+ assertEquals("mocked", SingleEnum.VALUE_A.greeting());
+ }
+
+ assertEquals("hello", SingleEnum.VALUE_A.greeting());
+ }
+
+ @Test
+ public void mockEnumDoesNotAffectOtherValues() {
+ try (MockedSingleton mocked = mockSingleton(SingleEnum.VALUE_A)) {
+ when(SingleEnum.VALUE_A.greeting()).thenReturn("mocked");
+
+ assertEquals("mocked", SingleEnum.VALUE_A.greeting());
+ assertEquals("world", SingleEnum.VALUE_B.greeting());
+ }
+ }
+
+ @Test
+ public void mockSingletonInstance() {
+ assertEquals("original", SimpleSingleton.INSTANCE.getValue());
+
+ try (MockedSingleton mocked = mockSingleton(SimpleSingleton.INSTANCE)) {
+ when(SimpleSingleton.INSTANCE.getValue()).thenReturn("mocked");
+ assertEquals("mocked", SimpleSingleton.INSTANCE.getValue());
+ }
+
+ assertEquals("original", SimpleSingleton.INSTANCE.getValue());
+ }
+
+ @Test
+ public void getInstanceReturnsSameObject() {
+ try (MockedSingleton mocked = mockSingleton(SingleEnum.VALUE_A)) {
+ assertSame(SingleEnum.VALUE_A, mocked.getInstance());
+ }
+ }
+
+ @Test
+ public void resetClearsStubs() {
+ try (MockedSingleton mocked = mockSingleton(SingleEnum.VALUE_A)) {
+ when(SingleEnum.VALUE_A.greeting()).thenReturn("mocked");
+ assertEquals("mocked", SingleEnum.VALUE_A.greeting());
+
+ reset(SingleEnum.VALUE_A);
+ // After reset, default mock behavior returns null for objects
+ assertEquals(null, SingleEnum.VALUE_A.greeting());
+ }
+ }
+
+ @Test
+ public void verifyInteraction() {
+ try (MockedSingleton mocked = mockSingleton(SimpleSingleton.INSTANCE)) {
+ SimpleSingleton.INSTANCE.getValue();
+
+ verify(SimpleSingleton.INSTANCE).getValue();
+ }
+ }
+
+ @Test
+ public void stubMethodWithArgs() {
+ try (MockedSingleton mocked = mockSingleton(SimpleSingleton.INSTANCE)) {
+ when(SimpleSingleton.INSTANCE.add(2, 3)).thenReturn(99);
+
+ assertEquals(99, SimpleSingleton.INSTANCE.add(2, 3));
+ assertEquals(0, SimpleSingleton.INSTANCE.add(1, 1));
+ }
+
+ assertEquals(2, SimpleSingleton.INSTANCE.add(1, 1));
+ }
+}
diff --git a/dexmaker-mockito-inline/build.gradle b/dexmaker-mockito-inline/build.gradle
index d077f5d..deb4e7f 100644
--- a/dexmaker-mockito-inline/build.gradle
+++ b/dexmaker-mockito-inline/build.gradle
@@ -41,5 +41,5 @@ dependencies {
implementation project(':dexmaker')
- api 'org.mockito:mockito-core:2.28.2', { exclude group: 'net.bytebuddy' }
+ api libs.mockito.core, { exclude group: 'net.bytebuddy' }
}
diff --git a/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/ClassTransformer.java b/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/ClassTransformer.java
index 89f713a..fa43355 100644
--- a/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/ClassTransformer.java
+++ b/dexmaker-mockito-inline/src/main/java/com/android/dx/mockito/inline/ClassTransformer.java
@@ -94,11 +94,12 @@ class ClassTransformer {
* mocked or not.
*/
ClassTransformer(JvmtiAgent agent, Class dispatcherClass,
- Map