First step deprecating StaticMockFixtureRule:

- Mark it as deprecated.
- Add support to StaticMockFixture on ExtendedMockitoRule
- Also deprecate ExtendedMockitoRule methods added to support
  TestableDeviceConfig

Test: atest ModulesUtilsTestingTests
Bug: 281577492
Change-Id: I94f6245ee201df65449db242cd6fc33018b1c6cd
diff --git a/java/com/android/modules/utils/testing/ExtendedMockitoRule.java b/java/com/android/modules/utils/testing/ExtendedMockitoRule.java
index be64f4b..5a1d57e 100644
--- a/java/com/android/modules/utils/testing/ExtendedMockitoRule.java
+++ b/java/com/android/modules/utils/testing/ExtendedMockitoRule.java
@@ -35,8 +35,12 @@
 import org.mockito.quality.Strictness;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
 
 /**
  * Rule to make it easier to use Extended Mockito:
@@ -66,6 +70,7 @@
     private @Nullable final Runnable mAfterSessionFinishedCallback;
     private final List<Class<?>> mMockedStaticClasses;
     private final List<Class<?>> mSpiedStaticClasses;
+    private final List<StaticMockFixture> mStaticMockFixtures;
     private final @Nullable SessionBuilderVisitor mSessionBuilderConfigurator;
     private final boolean mClearInlineMocks;
 
@@ -80,11 +85,14 @@
         mSessionBuilderConfigurator = builder.mSessionBuilderConfigurator;
         mMockedStaticClasses = builder.mMockedStaticClasses;
         mSpiedStaticClasses = builder.mSpiedStaticClasses;
+        mStaticMockFixtures = builder.mStaticMockFixtures == null ? Collections.emptyList()
+                : builder.mStaticMockFixtures;
         mClearInlineMocks = builder.mClearInlineMocks;
         Log.v(TAG, "strictness=" + mStrictness + ", testClassInstance" + mTestClassInstance
                 + ", mockedStaticClasses=" + mMockedStaticClasses
                 + ", spiedStaticClasses=" + mSpiedStaticClasses
-                + ", mSessionBuilderConfigurator=" + mSessionBuilderConfigurator
+                + ", staticMockFixtures=" + mStaticMockFixtures
+                + ", sessionBuilderConfigurator=" + mSessionBuilderConfigurator
                 + ", afterSessionFinishedCallback=" + mAfterSessionFinishedCallback
                 + ", mockitoFramework=" + mMockitoFramework
                 + ", mockitoSession=" + mMockitoSession
@@ -93,10 +101,7 @@
 
     @Override
     public Statement apply(Statement base, Description description) {
-        createMockitoSession();
-
-        // TODO(b/281577492): will need to provide a afterSessionCreated() callback in order to
-        // change StaticMockFixtureRule to use it
+        createMockitoSession(description);
 
         return new TestWatcher() {
             @Override
@@ -116,39 +121,75 @@
         }.apply(base, description);
     }
 
-    private void createMockitoSession() {
-        Log.v(TAG, "Creating (and initializing mocks on) session builder with strictness "
-                + mStrictness);
-        StaticMockitoSessionBuilder sessionBuilder = mockitoSession().strictness(mStrictness)
-                .initMocks(mTestClassInstance);
+    private void createMockitoSession(Description description) {
+        Log.v(TAG, "Creating session builder with strictness " + mStrictness);
+        StaticMockitoSessionBuilder mSessionBuilder = mockitoSession().strictness(mStrictness);
 
-        setUpMockedClasses(sessionBuilder);
+        setUpMockedClasses(mSessionBuilder);
+
+        if (mTestClassInstance != null) {
+            Log.v(TAG, "Initializing mocks on " + description + " using " + mSessionBuilder);
+            mSessionBuilder.initMocks(mTestClassInstance);
+        } else {
+            Log.v(TAG, "NOT Initializing mocks on " + description + " as requested by builder");
+        }
 
         if (mMockitoSession != null) {
             Log.d(TAG, "NOT creating session as set on builder: " + mMockitoSession);
         } else {
-            Log.v(TAG, "Creating mockito session using " + sessionBuilder);
-            mMockitoSession = sessionBuilder.startMocking();
+            Log.d(TAG, "Creating mockito session using " + mSessionBuilder);
+            mMockitoSession = mSessionBuilder.startMocking();
         }
+
+        setUpMockBehaviors();
     }
 
     private void setUpMockedClasses(StaticMockitoSessionBuilder sessionBuilder) {
-        mMockedStaticClasses.forEach((c) -> sessionBuilder.mockStatic(c));
-        mSpiedStaticClasses.forEach((c) -> sessionBuilder.spyStatic(c));
+        if (!mStaticMockFixtures.isEmpty()) {
+            for (StaticMockFixture fixture : mStaticMockFixtures) {
+                Log.v(TAG, "Calling setUpMockedClasses(" + sessionBuilder + ") on " + fixture);
+                fixture.setUpMockedClasses(sessionBuilder);
+            }
+        }
+        for (Class<?> clazz: mMockedStaticClasses) {
+            Log.v(TAG, "Calling mockStatic() on " + clazz);
+            sessionBuilder.mockStatic(clazz);
+        }
+        for (Class<?> clazz: mSpiedStaticClasses) {
+            Log.v(TAG, "Calling spyStatic() on " + clazz);
+            sessionBuilder.spyStatic(clazz);
+        }
         if (mSessionBuilderConfigurator != null) {
             Log.v(TAG, "Visiting " + mSessionBuilderConfigurator + " with " + sessionBuilder);
             mSessionBuilderConfigurator.visit(sessionBuilder);
         }
     }
 
+    private void setUpMockBehaviors() {
+        if (mStaticMockFixtures.isEmpty()) {
+            Log.v(TAG, "setUpMockBehaviors(): not needed, mStaticMockFixtures is empty");
+            return;
+        }
+        for (StaticMockFixture fixture : mStaticMockFixtures) {
+            Log.v(TAG, "Calling setUpMockBehaviors() on " + fixture);
+            fixture.setUpMockBehaviors();
+        }
+    }
+
     private void tearDown(Description description, Throwable e) {
-        Log.v(TAG, "Finishing mockito session " + mMockitoSession + " on " + description
-                + " (e=" + e + ")");
+        Log.d(TAG, "Finishing mockito session " + mMockitoSession + " on " + description
+                + (e == null ? "" : " (which failed with " + e + ")"));
         try {
             try {
                 mMockitoSession.finishMocking(e);
                 mMockitoSession = null;
             } finally {
+                // Must iterate in reverse order
+                for (int i = mStaticMockFixtures.size() - 1; i >= 0; i--) {
+                    StaticMockFixture fixture = mStaticMockFixtures.get(i);
+                    Log.v(TAG, "Calling tearDown() on " + fixture);
+                    fixture.tearDown();
+                }
                 if (mAfterSessionFinishedCallback != null) {
                     mAfterSessionFinishedCallback.run();
                 }
@@ -180,6 +221,7 @@
         private final Object mTestClassInstance;
         private final List<Class<?>> mMockedStaticClasses = new ArrayList<>();
         private final List<Class<?>> mSpiedStaticClasses = new ArrayList<>();
+        private @Nullable List<StaticMockFixture> mStaticMockFixtures;
         private Strictness mStrictness = Strictness.LENIENT;
         private @Nullable MockitoFramework mMockitoFramework;
         private @Nullable MockitoSession mMockitoSession;
@@ -188,13 +230,23 @@
         private boolean mClearInlineMocks = true;
 
         /**
-         * Constructs a builder for the giving test instance (typically {@code this}).
+         * Constructs a builder for the giving test instance (typically {@code this}) and initialize
+         * mocks on it.
          */
         public Builder(Object testClassInstance) {
             mTestClassInstance = Objects.requireNonNull(testClassInstance);
         }
 
         /**
+         * Constructs a builder that doesn't initialize mocks.
+         *
+         * <p>Typically used on test classes that already initialize mocks somewhere else.
+         */
+        public Builder() {
+            mTestClassInstance = null;
+        }
+
+        /**
          * Sets the mock strictness.
          */
         public Builder setStrictness(Strictness strictness) {
@@ -230,15 +282,34 @@
             return this;
         }
 
-        // TODO(b/281577492): remove if / when it supports StaticMockFixture, as it's only used by
-        // CachedAppOptimizerTest
+        /**
+         * Uses the supplied {@link StaticMockFixture} as well.
+         */
+        @SafeVarargs
+        public final Builder addStaticMockFixtures(
+                Supplier<? extends StaticMockFixture>... suppliers) {
+            List<StaticMockFixture> fixtures = Arrays
+                    .stream(Objects.requireNonNull(suppliers)).map(s -> s.get())
+                    .collect(Collectors.toList());
+            if (mStaticMockFixtures == null) {
+                mStaticMockFixtures = fixtures;
+            } else {
+                mStaticMockFixtures.addAll(fixtures);
+            }
+            return this;
+        }
+
+        // TODO(b/281577492): remove once CachedAppOptimizerTest doesn't use anymore
         /**
          * Alternative for {@link #spyStatic(Class)} / {@link #mockStatic(Class)}; typically used
          * when the same setup is shared by multiple tests.
          *
+         * @deprecated use {@link #addStaticMockFixtures(Supplier...)} instead
+         *
          * @throws IllegalStateException if {@link #mockStatic(Class)} or {@link #spyStatic(Class)}
          * was called before.
          */
+        @Deprecated
         public Builder configureSessionBuilder(
                 SessionBuilderVisitor sessionBuilderConfigurator) {
             Preconditions.checkState(mMockedStaticClasses.isEmpty(),
@@ -270,14 +341,14 @@
             return this;
         }
 
-        // Used mostly by ExtendedMockitoRuleTest itself
+        // Used by ExtendedMockitoRuleTest itself
         @VisibleForTesting
         Builder setMockitoFrameworkForTesting(MockitoFramework mockitoFramework) {
             mMockitoFramework = Objects.requireNonNull(mockitoFramework);
             return this;
         }
 
-        // Used mostly by ExtendedMockitoRuleTest itself
+        // Used by ExtendedMockitoRuleTest itself
         @VisibleForTesting
         Builder setMockitoSessionForTesting(MockitoSession mockitoSession) {
             mMockitoSession = Objects.requireNonNull(mockitoSession);
diff --git a/java/com/android/modules/utils/testing/StaticMockFixtureRule.java b/java/com/android/modules/utils/testing/StaticMockFixtureRule.java
index 36f6e32..def691a 100644
--- a/java/com/android/modules/utils/testing/StaticMockFixtureRule.java
+++ b/java/com/android/modules/utils/testing/StaticMockFixtureRule.java
@@ -45,7 +45,10 @@
  * public final StaticMockFixtureRule mStaticMockFixtureRule =
  *     new StaticMockFixtureRule(mStaticMockFixtures);
  * </pre>
+ *
+ * @deprecated use {@link ExtendedMockitoRule} instead.
  */
+@Deprecated
 public class StaticMockFixtureRule implements TestRule {
 
     private static final String TAG = StaticMockFixtureRule.class.getSimpleName();
diff --git a/java/com/android/modules/utils/testing/TestableDeviceConfig.java b/java/com/android/modules/utils/testing/TestableDeviceConfig.java
index 79b7876..ed4fe10 100644
--- a/java/com/android/modules/utils/testing/TestableDeviceConfig.java
+++ b/java/com/android/modules/utils/testing/TestableDeviceConfig.java
@@ -30,6 +30,7 @@
 import android.provider.DeviceConfig;
 import android.provider.DeviceConfig.Properties;
 import android.util.ArrayMap;
+import android.util.Log;
 import android.util.Pair;
 
 import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
@@ -52,6 +53,8 @@
  */
 public final class TestableDeviceConfig implements StaticMockFixture {
 
+    private static final String TAG = TestableDeviceConfig.class.getSimpleName();
+
     private Map<DeviceConfig.OnPropertiesChangedListener, Pair<String, Executor>>
             mOnPropertiesChangedListenerMap = new HashMap<>();
     private Map<String, String> mKeyValueMap = new ConcurrentHashMap<>();
@@ -69,6 +72,7 @@
     @Override
     public StaticMockitoSessionBuilder setUpMockedClasses(
             StaticMockitoSessionBuilder sessionBuilder) {
+        Log.v(TAG, "setUpMockedClasses(): spying DeviceConfig");
         sessionBuilder.spyStatic(DeviceConfig.class);
         return sessionBuilder;
     }
@@ -79,6 +83,7 @@
     @Override
     public void setUpMockBehaviors() {
         doAnswer((Answer<Void>) invocationOnMock -> {
+            Log.v(TAG, "setUpMockBehaviors(): mocking call to " + invocationOnMock);
             String namespace = invocationOnMock.getArgument(0);
             Executor executor = invocationOnMock.getArgument(1);
             DeviceConfig.OnPropertiesChangedListener onPropertiesChangedListener =
@@ -91,6 +96,7 @@
                 any(DeviceConfig.OnPropertiesChangedListener.class)));
 
         doAnswer((Answer<Boolean>) invocationOnMock -> {
+            Log.v(TAG, "setUpMockBehaviors(): mocking call to " + invocationOnMock);
             String namespace = invocationOnMock.getArgument(0);
             String name = invocationOnMock.getArgument(1);
             String value = invocationOnMock.getArgument(2);
@@ -122,6 +128,7 @@
         }).when(() -> DeviceConfig.setProperties(any(Properties.class)));
 
         doAnswer((Answer<String>) invocationOnMock -> {
+            Log.v(TAG, "setUpMockBehaviors(): mocking call to " + invocationOnMock);
             String namespace = invocationOnMock.getArgument(0);
             String name = invocationOnMock.getArgument(1);
             return mKeyValueMap.get(getKey(namespace, name));
@@ -271,12 +278,25 @@
      * <pre class="prettyprint">
      * &#064;Rule
      * public final TestableDeviceConfigRule mTestableDeviceConfigRule =
-     *     new TestableDeviceConfigRule();
+     *     new TestableDeviceConfigRule(this);
      * </pre>
      */
-    public static class TestableDeviceConfigRule extends StaticMockFixtureRule {
+    public static class TestableDeviceConfigRule extends ExtendedMockitoRule {
+
+        /**
+         * Creates the rule, without initializing any mock..
+         */
         public TestableDeviceConfigRule() {
-            super(TestableDeviceConfig::new);
+            super(new ExtendedMockitoRule.Builder()
+                    .addStaticMockFixtures(TestableDeviceConfig::new));
+        }
+
+        /**
+         * Creates the rule, initializing the mocks for the given test.
+         */
+        public TestableDeviceConfigRule(Object testClassInstance) {
+            super(new ExtendedMockitoRule.Builder(testClassInstance)
+                    .addStaticMockFixtures(TestableDeviceConfig::new));
         }
     }
 }
diff --git a/javatests/com/android/modules/utils/testing/ExtendedMockitoRuleTest.java b/javatests/com/android/modules/utils/testing/ExtendedMockitoRuleTest.java
index 37b5530..cb54f9f 100644
--- a/javatests/com/android/modules/utils/testing/ExtendedMockitoRuleTest.java
+++ b/javatests/com/android/modules/utils/testing/ExtendedMockitoRuleTest.java
@@ -20,7 +20,10 @@
 import static com.google.common.truth.Truth.assertWithMessage;
 
 import static org.junit.Assert.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.notNull;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -32,6 +35,7 @@
 import org.junit.runner.Description;
 import org.junit.runner.RunWith;
 import org.junit.runners.model.Statement;
+import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.MockitoFramework;
 import org.mockito.MockitoSession;
@@ -42,6 +46,7 @@
 import org.mockito.plugins.MockitoPlugins;
 import org.mockito.quality.Strictness;
 
+import java.util.function.Supplier;
 
 @RunWith(MockitoJUnitRunner.class)
 public final class ExtendedMockitoRuleTest {
@@ -51,6 +56,9 @@
     private @Mock Description mDescription;
     private @Mock Runnable mRunnable;
     private @Mock ExtendedMockitoRule.SessionBuilderVisitor mSessionBuilderVisitor;
+    private @Mock StaticMockFixture mStaticMockFixture1;
+    private @Mock StaticMockFixture mStaticMockFixture2;
+    private @Mock StaticMockFixture mStaticMockFixture3;
 
     private final ClassUnderTest mClassUnderTest = new ClassUnderTest();
     private final ExtendedMockitoRule.Builder mBuilder =
@@ -60,6 +68,15 @@
     private final ExtendedMockitoRule.Builder mUnsafeBuilder =
             new ExtendedMockitoRule.Builder(mClassUnderTest).dontClearInlineMocks();
 
+    private final Supplier<StaticMockFixture> mSupplier1 = () -> {
+        return mStaticMockFixture1;
+    };
+    private final Supplier<StaticMockFixture> mSupplier2 = () -> {
+        return mStaticMockFixture2;
+    };
+    private final Supplier<StaticMockFixture> mSupplier3 = () -> {
+        return mStaticMockFixture3;
+    };
 
     @Test
     public void testBuilder_constructor_null() {
@@ -88,6 +105,12 @@
     }
 
     @Test
+    public void testBuilder_addStaticMockFixtures_null() {
+        assertThrows(NullPointerException.class,
+                () -> mBuilder.addStaticMockFixtures((Supplier<StaticMockFixture>) null));
+    }
+
+    @Test
     public void testBuilder_afterSessionFinished_null() {
         assertThrows(NullPointerException.class, () -> mBuilder.afterSessionFinished(null));
     }
@@ -112,6 +135,13 @@
     }
 
     @Test
+    public void testMocksNotInitialized() throws Throwable {
+        new ExtendedMockitoRule.Builder().build().apply(mStatement, mDescription).evaluate();
+
+        assertWithMessage("@Mock object").that(mClassUnderTest.mMock).isNull();
+    }
+
+    @Test
     public void testStrictness_lenientByDefault() throws Throwable {
         applyRuleOnTestThatDoesntUseExpectation(/* strictness= */ null);
     }
@@ -269,6 +299,89 @@
     }
 
     @Test
+    public void testAddStaticMockFixtures_once() throws Throwable {
+        InOrder inOrder = inOrder(mStaticMockFixture1, mStaticMockFixture2);
+
+        mUnsafeBuilder
+                .addStaticMockFixtures(mSupplier1, mSupplier2)
+                .build().apply(mStatement, mDescription).evaluate();
+
+        inOrder.verify(mStaticMockFixture1).setUpMockedClasses(any());
+        inOrder.verify(mStaticMockFixture2).setUpMockedClasses(any());
+
+        inOrder.verify(mStaticMockFixture1).setUpMockBehaviors();
+        inOrder.verify(mStaticMockFixture2).setUpMockBehaviors();
+
+        inOrder.verify(mStaticMockFixture2).tearDown();
+        inOrder.verify(mStaticMockFixture1).tearDown();
+    }
+
+    @Test
+    public void testAddStaticMockFixtures_twice() throws Throwable {
+        InOrder inOrder = inOrder(mStaticMockFixture1, mStaticMockFixture2, mStaticMockFixture3,
+                mStaticMockFixture3);
+
+        mUnsafeBuilder
+                .addStaticMockFixtures(mSupplier1, mSupplier2)
+                .addStaticMockFixtures(mSupplier3)
+                .build().apply(mStatement, mDescription).evaluate();
+
+        inOrder.verify(mStaticMockFixture1).setUpMockedClasses(any());
+        inOrder.verify(mStaticMockFixture2).setUpMockedClasses(any());
+        inOrder.verify(mStaticMockFixture3).setUpMockedClasses(any());
+
+        inOrder.verify(mStaticMockFixture1).setUpMockBehaviors();
+        inOrder.verify(mStaticMockFixture2).setUpMockBehaviors();
+        inOrder.verify(mStaticMockFixture3).setUpMockBehaviors();
+
+        inOrder.verify(mStaticMockFixture3).tearDown();
+        inOrder.verify(mStaticMockFixture2).tearDown();
+        inOrder.verify(mStaticMockFixture1).tearDown();
+    }
+
+    @Test
+    public void testMockAndSpyStaticAndAddStaticMockFixtures() throws Throwable {
+        InOrder inOrder = inOrder(mStaticMockFixture1, mStaticMockFixture2, mStaticMockFixture3,
+                mStaticMockFixture3);
+
+        mUnsafeBuilder
+                .mockStatic(StaticClass.class)
+                .spyStatic(AnotherStaticClass.class)
+                .addStaticMockFixtures(mSupplier1, mSupplier2)
+                .addStaticMockFixtures(mSupplier3)
+                .build()
+                .apply(new Statement() {
+                    @Override
+                    public void evaluate() throws Throwable {
+                        doReturn("mocko()").when(() -> StaticClass.marco());
+                        doReturn("MOCKO()").when(() -> AnotherStaticClass.marco());
+
+                        assertWithMessage("StaticClass.marco()")
+                                .that(StaticClass.marco()).isEqualTo("mocko()");
+                        assertWithMessage("StaticClass.water()")
+                                .that(StaticClass.water()).isNull(); // not mocked
+
+                        assertWithMessage("AnotherStaticClass.marco()")
+                                .that(AnotherStaticClass.marco()).isEqualTo("MOCKO()");
+                        assertWithMessage("AnotherStaticClass.water()")
+                                .that(AnotherStaticClass.water()).isEqualTo("POLO");
+                    }
+                }, mDescription).evaluate();
+
+        inOrder.verify(mStaticMockFixture1).setUpMockedClasses(any());
+        inOrder.verify(mStaticMockFixture2).setUpMockedClasses(any());
+        inOrder.verify(mStaticMockFixture3).setUpMockedClasses(any());
+
+        inOrder.verify(mStaticMockFixture1).setUpMockBehaviors();
+        inOrder.verify(mStaticMockFixture2).setUpMockBehaviors();
+        inOrder.verify(mStaticMockFixture3).setUpMockBehaviors();
+
+        inOrder.verify(mStaticMockFixture3).tearDown();
+        inOrder.verify(mStaticMockFixture2).tearDown();
+        inOrder.verify(mStaticMockFixture1).tearDown();
+    }
+
+    @Test
     public void testConfigureSessionBuilder_afterMockStatic() throws Throwable {
         assertThrows(IllegalStateException.class, () -> mBuilder.mockStatic(StaticClass.class)
                 .configureSessionBuilder(mSessionBuilderVisitor));
@@ -365,6 +478,21 @@
     }
 
     @Test
+    public void testMockitoFrameworkCleared_whenStaticMockFixturesFailed() throws Throwable {
+        MyMockitoFramework mockitoFramework = new MyMockitoFramework();
+        RuntimeException exception = new RuntimeException("D'OH!");
+        doThrow(exception).when(mStaticMockFixture1).tearDown();
+
+        Exception thrown = assertThrows(Exception.class,
+                () -> mBuilder.setMockitoFrameworkForTesting(mockitoFramework)
+                        .addStaticMockFixtures(mSupplier1).build().apply(mStatement, mDescription)
+                        .evaluate());
+
+        assertWithMessage("exception").that(thrown).isSameInstanceAs(exception);
+        assertWithMessage("mockito framework cleared").that(mockitoFramework.called).isTrue();
+    }
+
+    @Test
     public void testMockitoFrameworkCleared_whenSessionFailsToFinish() throws Throwable {
         MyMockitoFramework mockitoFramework = new MyMockitoFramework();
         MockitoSessionThatFailsToFinish mockitoSession = new MockitoSessionThatFailsToFinish();
@@ -435,6 +563,9 @@
     // MockitoFramework because of that
     private static final class MyMockitoFramework implements MockitoFramework {
 
+        private static int sCounter;
+
+        private final int mId = ++sCounter;
         public boolean called;
 
         @Override
@@ -465,6 +596,11 @@
         public MockitoFramework addListener(MockitoListener arg0) {
             return null;
         }
+
+        @Override
+        public String toString() {
+            return "MyMockitoFramework-" + mId;
+        }
     };
 
     // Used on tests that check if the clearInlineMocks() is called - such tests cannot mock a
diff --git a/javatests/com/android/modules/utils/testing/MultipleStaticMocksTest.java b/javatests/com/android/modules/utils/testing/MultipleStaticMocksTest.java
index b925a6c..a6fb68e 100644
--- a/javatests/com/android/modules/utils/testing/MultipleStaticMocksTest.java
+++ b/javatests/com/android/modules/utils/testing/MultipleStaticMocksTest.java
@@ -35,8 +35,8 @@
 @SmallTest
 public class MultipleStaticMocksTest {
     @Rule
-    public StaticMockFixtureRule mStaticMockFixtureRule =
-            new StaticMockFixtureRule(AB::new, CD::new);
+    public ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this)
+            .addStaticMockFixtures(AB::new, CD::new).build();
 
     private List<String> mCollected;
 
diff --git a/javatests/com/android/modules/utils/testing/TestableDeviceConfigAndOtherStaticMocksTest.java b/javatests/com/android/modules/utils/testing/TestableDeviceConfigAndOtherStaticMocksTest.java
index 8ebe424..68a5db9 100644
--- a/javatests/com/android/modules/utils/testing/TestableDeviceConfigAndOtherStaticMocksTest.java
+++ b/javatests/com/android/modules/utils/testing/TestableDeviceConfigAndOtherStaticMocksTest.java
@@ -36,8 +36,8 @@
 @SmallTest
 public class TestableDeviceConfigAndOtherStaticMocksTest {
     @Rule
-    public StaticMockFixtureRule mStaticMockFixtureRule =
-            new StaticMockFixtureRule(TestableDeviceConfig::new, AB::new, CD::new);
+    public ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this)
+            .addStaticMockFixtures(TestableDeviceConfig::new, AB::new, CD::new).build();
 
     private List<String> mCollected;