diff --git a/javatests/com/android/tradefed/device/NativeDeviceTest.java b/javatests/com/android/tradefed/device/NativeDeviceTest.java
index a69890d..2d42d7b 100644
--- a/javatests/com/android/tradefed/device/NativeDeviceTest.java
+++ b/javatests/com/android/tradefed/device/NativeDeviceTest.java
@@ -24,6 +24,10 @@
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import com.android.ddmlib.AdbCommandRejectedException;
 import com.android.ddmlib.FileListingService.FileEntry;
@@ -56,12 +60,14 @@
 import com.android.tradefed.util.ProcessInfo;
 import com.android.tradefed.util.StreamUtil;
 
-import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
+import org.mockito.AdditionalAnswers;
+import org.mockito.Mock;
 import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
 
 import java.io.File;
 import java.io.IOException;
@@ -86,20 +92,18 @@
 
     private static final String MOCK_DEVICE_SERIAL = "serial";
     private static final String FAKE_NETWORK_SSID = "FakeNet";
-    private static final String FAKE_NETWORK_PASSWORD ="FakePass";
+    private static final String FAKE_NETWORK_PASSWORD = "FakePass";
 
-    private IDevice mMockIDevice;
+    @Mock IDevice mMockIDevice;
     private TestableAndroidNativeDevice mTestDevice;
-    private IDeviceRecovery mMockRecovery;
-    private IDeviceStateMonitor mMockStateMonitor;
-    private IRunUtil mMockRunUtil;
-    private IWifiHelper mMockWifi;
-    private IDeviceMonitor mMockDvcMonitor;
+    @Mock IDeviceRecovery mMockRecovery;
+    @Mock IDeviceStateMonitor mMockStateMonitor;
+    @Mock IRunUtil mMockRunUtil;
+    @Mock IWifiHelper mMockWifi;
+    @Mock IDeviceMonitor mMockDvcMonitor;
     private IHostOptions mHostOptions;
 
-    /**
-     * A {@link TestDevice} that is suitable for running tests against
-     */
+    /** A {@link TestDevice} that is suitable for running tests against */
     private class TestableAndroidNativeDevice extends NativeDevice {
 
         public boolean wasCalled = false;
@@ -126,34 +130,30 @@
 
     @Before
     public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
         mHostOptions = new HostOptions();
-        mMockIDevice = EasyMock.createMock(IDevice.class);
-        EasyMock.expect(mMockIDevice.getSerialNumber()).andReturn(MOCK_DEVICE_SERIAL).anyTimes();
-        mMockRecovery = EasyMock.createMock(IDeviceRecovery.class);
-        mMockStateMonitor = EasyMock.createMock(IDeviceStateMonitor.class);
-        mMockDvcMonitor = EasyMock.createMock(IDeviceMonitor.class);
-        mMockRunUtil = EasyMock.createMock(IRunUtil.class);
-        mMockWifi = EasyMock.createMock(IWifiHelper.class);
-        mMockWifi.cleanUp();
-        EasyMock.expectLastCall().anyTimes();
+
+        when(mMockIDevice.getSerialNumber()).thenReturn(MOCK_DEVICE_SERIAL);
 
         // A TestDevice with a no-op recoverDevice() implementation
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public void recoverDevice() throws DeviceNotAvailableException {
-                // ignore
-            }
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public void recoverDevice() throws DeviceNotAvailableException {
+                        // ignore
+                    }
 
-            @Override
-            public IDevice getIDevice() {
-                return mMockIDevice;
-            }
+                    @Override
+                    public IDevice getIDevice() {
+                        return mMockIDevice;
+                    }
 
-            @Override
-            IWifiHelper createWifiHelper() {
-                return mMockWifi;
-            }
-        };
+                    @Override
+                    IWifiHelper createWifiHelper() {
+                        return mMockWifi;
+                    }
+                };
         mTestDevice.setRecovery(mMockRecovery);
         mTestDevice.setCommandTimeout(100);
         mTestDevice.setLogStartDelay(-1);
@@ -281,13 +281,14 @@
     /** Unit test for {@link NativeDevice#pushDir(File, String)}. */
     @Test
     public void testPushDir_childFile() throws Exception {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public boolean pushFile(File localFile, String remoteFilePath)
-                    throws DeviceNotAvailableException {
-                return true;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public boolean pushFile(File localFile, String remoteFilePath)
+                            throws DeviceNotAvailableException {
+                        return true;
+                    }
+                };
         File testDir = FileUtil.createTempDir("pushDirTest");
         FileUtil.createTempFile("test1", ".txt", testDir);
         assertTrue(mTestDevice.pushDir(testDir, ""));
@@ -297,17 +298,20 @@
     /** Unit test for {@link NativeDevice#pushDir(File, String)}. */
     @Test
     public void testPushDir_childDir() throws Exception {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String executeShellCommand(String cmd) throws DeviceNotAvailableException {
-                return "";
-            }
-            @Override
-            public boolean pushFile(File localFile, String remoteFilePath)
-                    throws DeviceNotAvailableException {
-                return false;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String executeShellCommand(String cmd)
+                            throws DeviceNotAvailableException {
+                        return "";
+                    }
+
+                    @Override
+                    public boolean pushFile(File localFile, String remoteFilePath)
+                            throws DeviceNotAvailableException {
+                        return false;
+                    }
+                };
         File testDir = FileUtil.createTempDir("pushDirTest");
         File subDir = FileUtil.createTempDir("testSubDir", testDir);
         FileUtil.createTempDir("test1", subDir);
@@ -350,7 +354,7 @@
     /** Test {@link NativeDevice#pullDir(String, File)} when the remote directory is empty. */
     @Test
     public void testPullDir_nothingToDo() throws Exception {
-        final IFileEntry fakeEntry = EasyMock.createMock(IFileEntry.class);
+        final IFileEntry fakeEntry = mock(IFileEntry.class);
         mTestDevice =
                 new TestableAndroidNativeDevice() {
                     @Override
@@ -367,9 +371,9 @@
                 };
         File dir = FileUtil.createTempDir("tf-test");
         Collection<IFileEntry> childrens = new ArrayList<>();
-        EasyMock.expect(fakeEntry.getChildren(false)).andReturn(childrens);
+        when(fakeEntry.getChildren(false)).thenReturn(childrens);
         // Empty list of childen
-        EasyMock.replay(fakeEntry);
+
         try {
             boolean res = mTestDevice.pullDir("/some_device_path/screenshots/", dir);
             assertTrue(res);
@@ -377,7 +381,6 @@
         } finally {
             FileUtil.recursiveDelete(dir);
         }
-        EasyMock.verify(fakeEntry);
     }
 
     /**
@@ -386,8 +389,8 @@
      */
     @Test
     public void testPullDir() throws Exception {
-        final IFileEntry fakeEntry = EasyMock.createMock(IFileEntry.class);
-        final IFileEntry fakeDir = EasyMock.createMock(IFileEntry.class);
+        final IFileEntry fakeEntry = mock(IFileEntry.class);
+        final IFileEntry fakeDir = mock(IFileEntry.class);
         mTestDevice =
                 new TestableAndroidNativeDevice() {
                     private boolean mFirstCall = true;
@@ -423,22 +426,21 @@
                 };
         File dir = FileUtil.createTempDir("tf-test");
         Collection<IFileEntry> children = new ArrayList<>();
-        IFileEntry fakeFile = EasyMock.createMock(IFileEntry.class);
+        IFileEntry fakeFile = mock(IFileEntry.class);
         children.add(fakeFile);
-        EasyMock.expect(fakeFile.isDirectory()).andReturn(false);
-        EasyMock.expect(fakeFile.getName()).andReturn("fakeFile");
-        EasyMock.expect(fakeFile.getFullPath()).andReturn("/some_device_path/fakeFile");
+        when(fakeFile.isDirectory()).thenReturn(false);
+        when(fakeFile.getName()).thenReturn("fakeFile");
+        when(fakeFile.getFullPath()).thenReturn("/some_device_path/fakeFile");
 
         children.add(fakeDir);
-        EasyMock.expect(fakeDir.isDirectory()).andReturn(true);
-        EasyMock.expect(fakeDir.getName()).andReturn("fakeDir");
-        EasyMock.expect(fakeDir.getFullPath()).andReturn("/some_device_path/fakeDir");
+        when(fakeDir.isDirectory()).thenReturn(true);
+        when(fakeDir.getName()).thenReturn("fakeDir");
+        when(fakeDir.getFullPath()).thenReturn("/some_device_path/fakeDir");
         // #pullDir is being called on dir fakeDir to pull everything recursively.
         Collection<IFileEntry> fakeDirChildren = new ArrayList<>();
-        EasyMock.expect(fakeDir.getChildren(false)).andReturn(fakeDirChildren);
-        EasyMock.expect(fakeEntry.getChildren(false)).andReturn(children);
+        when(fakeDir.getChildren(false)).thenReturn(fakeDirChildren);
+        when(fakeEntry.getChildren(false)).thenReturn(children);
 
-        EasyMock.replay(fakeEntry, fakeFile, fakeDir);
         try {
             boolean res = mTestDevice.pullDir("/some_device_path/", dir);
             assertTrue(res);
@@ -448,14 +450,13 @@
         } finally {
             FileUtil.recursiveDelete(dir);
         }
-        EasyMock.verify(fakeEntry, fakeFile, fakeDir);
     }
 
     /** Test pulling a directory when one of the pull fails. */
     @Test
     public void testPullDir_pullFail() throws Exception {
-        final IFileEntry fakeEntry = EasyMock.createMock(IFileEntry.class);
-        final IFileEntry fakeDir = EasyMock.createMock(IFileEntry.class);
+        final IFileEntry fakeEntry = mock(IFileEntry.class);
+        final IFileEntry fakeDir = mock(IFileEntry.class);
         mTestDevice =
                 new TestableAndroidNativeDevice() {
                     private boolean mFirstCall = true;
@@ -497,29 +498,28 @@
                 };
         File dir = FileUtil.createTempDir("tf-test");
         Collection<IFileEntry> children = new ArrayList<>();
-        IFileEntry fakeFile = EasyMock.createMock(IFileEntry.class);
+        IFileEntry fakeFile = mock(IFileEntry.class);
         children.add(fakeFile);
-        EasyMock.expect(fakeFile.isDirectory()).andReturn(false);
-        EasyMock.expect(fakeFile.getName()).andReturn("fakeFile");
-        EasyMock.expect(fakeFile.getFullPath()).andReturn("/some_device_path/fakeFile");
+        when(fakeFile.isDirectory()).thenReturn(false);
+        when(fakeFile.getName()).thenReturn("fakeFile");
+        when(fakeFile.getFullPath()).thenReturn("/some_device_path/fakeFile");
 
         children.add(fakeDir);
-        EasyMock.expect(fakeDir.isDirectory()).andReturn(true);
-        EasyMock.expect(fakeDir.getName()).andReturn("fakeDir");
-        EasyMock.expect(fakeDir.getFullPath()).andReturn("/some_device_path/fakeDir");
+        when(fakeDir.isDirectory()).thenReturn(true);
+        when(fakeDir.getName()).thenReturn("fakeDir");
+        when(fakeDir.getFullPath()).thenReturn("/some_device_path/fakeDir");
         // #pullDir is being called on dir fakeDir to pull everything recursively.
         Collection<IFileEntry> fakeDirChildren = new ArrayList<>();
-        IFileEntry secondLevelChildren = EasyMock.createMock(IFileEntry.class);
+        IFileEntry secondLevelChildren = mock(IFileEntry.class);
         fakeDirChildren.add(secondLevelChildren);
-        EasyMock.expect(fakeDir.getChildren(false)).andReturn(fakeDirChildren);
-        EasyMock.expect(fakeEntry.getChildren(false)).andReturn(children);
+        when(fakeDir.getChildren(false)).thenReturn(fakeDirChildren);
+        when(fakeEntry.getChildren(false)).thenReturn(children);
 
-        EasyMock.expect(secondLevelChildren.isDirectory()).andReturn(false);
-        EasyMock.expect(secondLevelChildren.getName()).andReturn("secondLevelChildren");
-        EasyMock.expect(secondLevelChildren.getFullPath())
-                .andReturn("/some_device_path/fakeDir/secondLevelChildren");
+        when(secondLevelChildren.isDirectory()).thenReturn(false);
+        when(secondLevelChildren.getName()).thenReturn("secondLevelChildren");
+        when(secondLevelChildren.getFullPath())
+                .thenReturn("/some_device_path/fakeDir/secondLevelChildren");
 
-        EasyMock.replay(fakeEntry, fakeFile, fakeDir, secondLevelChildren);
         try {
             boolean res = mTestDevice.pullDir("/some_device_path/", dir);
             // If one of the pull fails, the full command is considered failed.
@@ -533,7 +533,6 @@
         } finally {
             FileUtil.recursiveDelete(dir);
         }
-        EasyMock.verify(fakeEntry, fakeFile, fakeDir, secondLevelChildren);
     }
 
     /**
@@ -606,7 +605,7 @@
     @Test
     public void testSwitchUserTimeout_exception() throws Exception {
         try {
-            mTestDevice.switchUser(10, 5*1000);
+            mTestDevice.switchUser(10, 5 * 1000);
         } catch (UnsupportedOperationException onse) {
             return;
         }
@@ -749,26 +748,27 @@
     @Test
     public void testConnectToWifiNetworkIfNeeded_alreadyConnected()
             throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.checkConnectivity(mTestDevice.getOptions().getConnCheckUrl()))
-                .andReturn(true);
-        EasyMock.replay(mMockWifi);
-        assertTrue(mTestDevice.connectToWifiNetworkIfNeeded(FAKE_NETWORK_SSID,
-                FAKE_NETWORK_PASSWORD));
-        EasyMock.verify(mMockWifi);
+        when(mMockWifi.checkConnectivity(mTestDevice.getOptions().getConnCheckUrl()))
+                .thenReturn(true);
+
+        assertTrue(
+                mTestDevice.connectToWifiNetworkIfNeeded(FAKE_NETWORK_SSID, FAKE_NETWORK_PASSWORD));
     }
 
     /** Unit test for {@link NativeDevice#connectToWifiNetwork(String, String)}. */
     @Test
     public void testConnectToWifiNetwork_success() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.connectToNetwork(FAKE_NETWORK_SSID, FAKE_NETWORK_PASSWORD,
-                mTestDevice.getOptions().getConnCheckUrl(), false)).andReturn(true);
+        when(mMockWifi.connectToNetwork(
+                        FAKE_NETWORK_SSID,
+                        FAKE_NETWORK_PASSWORD,
+                        mTestDevice.getOptions().getConnCheckUrl(),
+                        false))
+                .thenReturn(true);
         Map<String, String> fakeWifiInfo = new HashMap<String, String>();
         fakeWifiInfo.put("bssid", FAKE_NETWORK_SSID);
-        EasyMock.expect(mMockWifi.getWifiInfo()).andReturn(fakeWifiInfo);
-        EasyMock.replay(mMockWifi, mMockIDevice);
-        assertTrue(mTestDevice.connectToWifiNetwork(FAKE_NETWORK_SSID,
-                FAKE_NETWORK_PASSWORD));
-        EasyMock.verify(mMockWifi, mMockIDevice);
+        when(mMockWifi.getWifiInfo()).thenReturn(fakeWifiInfo);
+
+        assertTrue(mTestDevice.connectToWifiNetwork(FAKE_NETWORK_SSID, FAKE_NETWORK_PASSWORD));
     }
 
     /**
@@ -777,19 +777,26 @@
      */
     @Test
     public void testConnectToWifiNetwork_failure() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.connectToNetwork(FAKE_NETWORK_SSID, FAKE_NETWORK_PASSWORD,
-                mTestDevice.getOptions().getConnCheckUrl(), false)).andReturn(false)
-                .times(mTestDevice.getOptions().getWifiAttempts());
+        when(mMockWifi.connectToNetwork(
+                        FAKE_NETWORK_SSID,
+                        FAKE_NETWORK_PASSWORD,
+                        mTestDevice.getOptions().getConnCheckUrl(),
+                        false))
+                .thenReturn(false);
         Map<String, String> fakeWifiInfo = new HashMap<String, String>();
         fakeWifiInfo.put("bssid", FAKE_NETWORK_SSID);
-        EasyMock.expect(mMockWifi.getWifiInfo()).andReturn(fakeWifiInfo)
-                .times(mTestDevice.getOptions().getWifiAttempts());
-        mMockRunUtil.sleep(EasyMock.anyLong());
-        EasyMock.expectLastCall().times(mTestDevice.getOptions().getWifiAttempts() - 1);
-        EasyMock.replay(mMockWifi, mMockIDevice, mMockRunUtil);
-        assertFalse(mTestDevice.connectToWifiNetwork(FAKE_NETWORK_SSID,
-                FAKE_NETWORK_PASSWORD));
-        EasyMock.verify(mMockWifi, mMockIDevice, mMockRunUtil);
+        when(mMockWifi.getWifiInfo()).thenReturn(fakeWifiInfo);
+
+        assertFalse(mTestDevice.connectToWifiNetwork(FAKE_NETWORK_SSID, FAKE_NETWORK_PASSWORD));
+        verify(mMockRunUtil, times(mTestDevice.getOptions().getWifiAttempts() - 1))
+                .sleep(Mockito.anyLong());
+        verify(mMockWifi, times(mTestDevice.getOptions().getWifiAttempts()))
+                .connectToNetwork(
+                        FAKE_NETWORK_SSID,
+                        FAKE_NETWORK_PASSWORD,
+                        mTestDevice.getOptions().getConnCheckUrl(),
+                        false);
+        verify(mMockWifi, times(mTestDevice.getOptions().getWifiAttempts())).getWifiInfo();
     }
 
     /**
@@ -803,69 +810,72 @@
         deviceOptionSetter.setOptionValue("max-wifi-connect-time", "10000");
         Clock mockClock = Mockito.mock(Clock.class);
         mTestDevice.setClock(mockClock);
-        EasyMock.expect(
-                        mMockWifi.connectToNetwork(
-                                FAKE_NETWORK_SSID,
-                                FAKE_NETWORK_PASSWORD,
-                                mTestDevice.getOptions().getConnCheckUrl(),
-                                false))
-                .andReturn(false)
-                .times(2);
+        when(mMockWifi.connectToNetwork(
+                        FAKE_NETWORK_SSID,
+                        FAKE_NETWORK_PASSWORD,
+                        mTestDevice.getOptions().getConnCheckUrl(),
+                        false))
+                .thenReturn(false);
         Mockito.when(mockClock.millis())
                 .thenReturn(Long.valueOf(0), Long.valueOf(6000), Long.valueOf(12000));
         Map<String, String> fakeWifiInfo = new HashMap<String, String>();
         fakeWifiInfo.put("bssid", FAKE_NETWORK_SSID);
-        EasyMock.expect(mMockWifi.getWifiInfo()).andReturn(fakeWifiInfo).times(2);
+        when(mMockWifi.getWifiInfo()).thenReturn(fakeWifiInfo);
 
-        EasyMock.replay(mMockWifi, mMockIDevice);
         assertFalse(mTestDevice.connectToWifiNetwork(FAKE_NETWORK_SSID, FAKE_NETWORK_PASSWORD));
-        EasyMock.verify(mMockWifi, mMockIDevice);
+        verify(mMockWifi, times(2))
+                .connectToNetwork(
+                        FAKE_NETWORK_SSID,
+                        FAKE_NETWORK_PASSWORD,
+                        mTestDevice.getOptions().getConnCheckUrl(),
+                        false);
+        verify(mMockWifi, times(2)).getWifiInfo();
         Mockito.verify(mockClock, Mockito.times(3)).millis();
     }
 
     /** Unit test for {@link NativeDevice#connectToWifiNetwork(String, String, boolean)}. */
     @Test
     public void testConnectToWifiNetwork_scanSsid() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.connectToNetwork(FAKE_NETWORK_SSID, FAKE_NETWORK_PASSWORD,
-                mTestDevice.getOptions().getConnCheckUrl(), true)).andReturn(true);
+        when(mMockWifi.connectToNetwork(
+                        FAKE_NETWORK_SSID,
+                        FAKE_NETWORK_PASSWORD,
+                        mTestDevice.getOptions().getConnCheckUrl(),
+                        true))
+                .thenReturn(true);
         Map<String, String> fakeWifiInfo = new HashMap<String, String>();
         fakeWifiInfo.put("bssid", FAKE_NETWORK_SSID);
-        EasyMock.expect(mMockWifi.getWifiInfo()).andReturn(fakeWifiInfo);
-        EasyMock.replay(mMockWifi, mMockIDevice);
-        assertTrue(mTestDevice.connectToWifiNetwork(FAKE_NETWORK_SSID,
-                FAKE_NETWORK_PASSWORD, true));
-        EasyMock.verify(mMockWifi, mMockIDevice);
+        when(mMockWifi.getWifiInfo()).thenReturn(fakeWifiInfo);
+
+        assertTrue(
+                mTestDevice.connectToWifiNetwork(FAKE_NETWORK_SSID, FAKE_NETWORK_PASSWORD, true));
     }
 
     /** Unit test for {@link NativeDevice#checkWifiConnection(String)}. */
     @Test
     public void testCheckWifiConnection() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.isWifiEnabled()).andReturn(true);
-        EasyMock.expect(mMockWifi.getSSID()).andReturn("\"" + FAKE_NETWORK_SSID + "\"");
-        EasyMock.expect(mMockWifi.hasValidIp()).andReturn(true);
-        EasyMock.expect(mMockWifi.checkConnectivity(mTestDevice.getOptions().getConnCheckUrl()))
-                .andReturn(true);
-        EasyMock.replay(mMockWifi, mMockIDevice);
+        when(mMockWifi.isWifiEnabled()).thenReturn(true);
+        when(mMockWifi.getSSID()).thenReturn("\"" + FAKE_NETWORK_SSID + "\"");
+        when(mMockWifi.hasValidIp()).thenReturn(true);
+        when(mMockWifi.checkConnectivity(mTestDevice.getOptions().getConnCheckUrl()))
+                .thenReturn(true);
+
         assertTrue(mTestDevice.checkWifiConnection(FAKE_NETWORK_SSID));
-        EasyMock.verify(mMockWifi, mMockIDevice);
     }
 
     /** Unit test for {@link NativeDevice#checkWifiConnection(String)} for a failure. */
     @Test
     public void testCheckWifiConnection_failure() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.isWifiEnabled()).andReturn(false);
-        EasyMock.replay(mMockWifi, mMockIDevice);
+        when(mMockWifi.isWifiEnabled()).thenReturn(false);
+
         assertFalse(mTestDevice.checkWifiConnection(FAKE_NETWORK_SSID));
-        EasyMock.verify(mMockWifi, mMockIDevice);
     }
 
     /** Unit test for {@link NativeDevice#isWifiEnabled()}. */
     @Test
     public void testIsWifiEnabled() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.isWifiEnabled()).andReturn(true);
-        EasyMock.replay(mMockWifi, mMockIDevice);
+        when(mMockWifi.isWifiEnabled()).thenReturn(true);
+
         assertTrue(mTestDevice.isWifiEnabled());
-        EasyMock.verify(mMockWifi, mMockIDevice);
     }
 
     /**
@@ -873,41 +883,39 @@
      */
     @Test
     public void testIsWifiEnabled_exception() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.isWifiEnabled()).andThrow(new RuntimeException());
-        EasyMock.replay(mMockWifi, mMockIDevice);
+        when(mMockWifi.isWifiEnabled()).thenThrow(new RuntimeException());
+
         assertFalse(mTestDevice.isWifiEnabled());
-        EasyMock.verify(mMockWifi, mMockIDevice);
     }
 
     /** Unit test for {@link NativeDevice#disconnectFromWifi()}. */
     @Test
     public void testDisconnectFromWifi() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.disconnectFromNetwork()).andReturn(true);
-        EasyMock.replay(mMockWifi, mMockIDevice);
+        when(mMockWifi.disconnectFromNetwork()).thenReturn(true);
+
         assertTrue(mTestDevice.disconnectFromWifi());
-        EasyMock.verify(mMockWifi, mMockIDevice);
     }
 
     /** Unit test for {@link NativeDevice#enableNetworkMonitor()}. */
     @Test
     public void testEnableNetworkMonitor() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.stopMonitor()).andReturn(null);
-        EasyMock.expect(mMockWifi.startMonitor(EasyMock.anyLong(),
-                EasyMock.eq(mTestDevice.getOptions().getConnCheckUrl()))).andReturn(true);
-        EasyMock.replay(mMockWifi, mMockIDevice);
+        when(mMockWifi.stopMonitor()).thenReturn(null);
+        when(mMockWifi.startMonitor(
+                        Mockito.anyLong(), Mockito.eq(mTestDevice.getOptions().getConnCheckUrl())))
+                .thenReturn(true);
+
         assertTrue(mTestDevice.enableNetworkMonitor());
-        EasyMock.verify(mMockWifi, mMockIDevice);
     }
 
     /** Unit test for {@link NativeDevice#enableNetworkMonitor()} in case of failure. */
     @Test
     public void testEnableNetworkMonitor_failure() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.stopMonitor()).andReturn(null);
-        EasyMock.expect(mMockWifi.startMonitor(EasyMock.anyLong(),
-                EasyMock.eq(mTestDevice.getOptions().getConnCheckUrl()))).andReturn(false);
-        EasyMock.replay(mMockWifi, mMockIDevice);
+        when(mMockWifi.stopMonitor()).thenReturn(null);
+        when(mMockWifi.startMonitor(
+                        Mockito.anyLong(), Mockito.eq(mTestDevice.getOptions().getConnCheckUrl())))
+                .thenReturn(false);
+
         assertFalse(mTestDevice.enableNetworkMonitor());
-        EasyMock.verify(mMockWifi, mMockIDevice);
     }
 
     /** Unit test for {@link NativeDevice#disableNetworkMonitor()}. */
@@ -917,62 +925,61 @@
         samples.add(Long.valueOf(42));
         samples.add(Long.valueOf(256));
         samples.add(Long.valueOf(-1)); // failure to connect
-        EasyMock.expect(mMockWifi.stopMonitor()).andReturn(samples);
-        EasyMock.replay(mMockWifi, mMockIDevice);
+        when(mMockWifi.stopMonitor()).thenReturn(samples);
+
         assertTrue(mTestDevice.disableNetworkMonitor());
-        EasyMock.verify(mMockWifi, mMockIDevice);
     }
 
     /** Unit test for {@link NativeDevice#reconnectToWifiNetwork()}. */
     @Test
     public void testReconnectToWifiNetwork() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockWifi.checkConnectivity(mTestDevice.getOptions().getConnCheckUrl()))
-                .andReturn(false);
-        EasyMock.expect(mMockWifi.checkConnectivity(mTestDevice.getOptions().getConnCheckUrl()))
-                .andReturn(true);
-        mMockRunUtil.sleep(EasyMock.anyLong());
-        EasyMock.expectLastCall();
-        EasyMock.replay(mMockWifi, mMockIDevice, mMockRunUtil);
+        when(mMockWifi.checkConnectivity(mTestDevice.getOptions().getConnCheckUrl()))
+                .thenReturn(false, true);
+
         try {
             mTestDevice.reconnectToWifiNetwork();
         } finally {
-            EasyMock.verify(mMockWifi, mMockIDevice, mMockRunUtil);
+            verify(mMockRunUtil, times(1)).sleep(Mockito.anyLong());
         }
     }
 
     /** Unit test for {@link NativeDevice#isHeadless()}. */
     @Test
     public void testIsHeadless() throws DeviceNotAvailableException {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String getProperty(String name) throws DeviceNotAvailableException {
-                return "1\n";
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String getProperty(String name) throws DeviceNotAvailableException {
+                        return "1\n";
+                    }
+                };
         assertTrue(mTestDevice.isHeadless());
     }
 
     /** Unit test for {@link NativeDevice#isHeadless()}. */
     @Test
     public void testIsHeadless_notHeadless() throws DeviceNotAvailableException {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String getProperty(String name) throws DeviceNotAvailableException {
-                return null;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String getProperty(String name) throws DeviceNotAvailableException {
+                        return null;
+                    }
+                };
         assertFalse(mTestDevice.isHeadless());
     }
 
     /** Unit test for {@link NativeDevice#getDeviceDate()}. */
     @Test
     public void testGetDeviceDate() throws DeviceNotAvailableException {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String executeShellCommand(String name) throws DeviceNotAvailableException {
-                return "21692641\n";
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String executeShellCommand(String name)
+                            throws DeviceNotAvailableException {
+                        return "21692641\n";
+                    }
+                };
         assertEquals(21692641000L, mTestDevice.getDeviceDate());
     }
 
@@ -993,11 +1000,11 @@
                         return 24;
                     }
                 };
-        ITestLogger listener = EasyMock.createMock(ITestLogger.class);
-        listener.testLog(dataName, LogDataType.BUGREPORTZ, stream);
-        EasyMock.replay(listener);
+        ITestLogger listener = mock(ITestLogger.class);
+
         assertTrue(mTestDevice.logBugreport(dataName, listener));
-        EasyMock.verify(listener);
+
+        verify(listener).testLog(dataName, LogDataType.BUGREPORTZ, stream);
     }
 
     /** Unit test for {@link NativeDevice#logBugreport(String, ITestLogger)}. */
@@ -1024,11 +1031,11 @@
                         return 23;
                     }
                 };
-        ITestLogger listener = EasyMock.createMock(ITestLogger.class);
-        listener.testLog(dataName, LogDataType.BUGREPORT, stream);
-        EasyMock.replay(listener);
+        ITestLogger listener = mock(ITestLogger.class);
+
         assertTrue(mTestDevice.logBugreport(dataName, listener));
-        EasyMock.verify(listener);
+
+        verify(listener).testLog(dataName, LogDataType.BUGREPORT, stream);
     }
 
     /** Unit test for {@link NativeDevice#logBugreport(String, ITestLogger)}. */
@@ -1051,10 +1058,9 @@
                         return 23;
                     }
                 };
-        ITestLogger listener = EasyMock.createMock(ITestLogger.class);
-        EasyMock.replay(listener);
+        ITestLogger listener = mock(ITestLogger.class);
+
         assertFalse(mTestDevice.logBugreport("test", listener));
-        EasyMock.verify(listener);
     }
 
     /** Unit test for {@link NativeDevice#takeBugreport()}. */
@@ -1074,12 +1080,13 @@
     /** Unit test for {@link NativeDevice#takeBugreport()}. */
     @Test
     public void testTakeBugreport_oldDevice() throws Exception {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public int getApiLevel() throws DeviceNotAvailableException {
-                return 19;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public int getApiLevel() throws DeviceNotAvailableException {
+                        return 19;
+                    }
+                };
         Bugreport report = mTestDevice.takeBugreport();
         try {
             assertNotNull(report);
@@ -1093,20 +1100,22 @@
     /** Unit test for {@link NativeDevice#takeBugreport()}. */
     @Test
     public void testTakeBugreport() throws Exception {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public int getApiLevel() throws DeviceNotAvailableException {
-                return 24;
-            }
-            @Override
-            protected File getBugreportzInternal() {
-                try {
-                    return FileUtil.createTempFile("bugreportz", ".zip");
-                } catch (IOException e) {
-                    return null;
-                }
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public int getApiLevel() throws DeviceNotAvailableException {
+                        return 24;
+                    }
+
+                    @Override
+                    protected File getBugreportzInternal() {
+                        try {
+                            return FileUtil.createTempFile("bugreportz", ".zip");
+                        } catch (IOException e) {
+                            return null;
+                        }
+                    }
+                };
         Bugreport report = mTestDevice.takeBugreport();
         try {
             assertNotNull(report);
@@ -1119,39 +1128,48 @@
     /** Unit test for {@link NativeDevice#getDeviceDate()}. */
     @Test
     public void testGetDeviceDate_wrongformat() throws DeviceNotAvailableException {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String executeShellCommand(String name) throws DeviceNotAvailableException {
-                return "WRONG\n";
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String executeShellCommand(String name)
+                            throws DeviceNotAvailableException {
+                        return "WRONG\n";
+                    }
+                };
         assertEquals(0, mTestDevice.getDeviceDate());
     }
 
     @Test
     public void testGetBugreport_deviceUnavail() throws Exception {
         final String expectedOutput = "this is the output\r\n in two lines\r\n";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public void executeShellCommand(
-                    String command, IShellOutputReceiver receiver,
-                    long maxTimeToOutputShellResponse, TimeUnit timeUnit, int retryAttempts)
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public void executeShellCommand(
+                            String command,
+                            IShellOutputReceiver receiver,
+                            long maxTimeToOutputShellResponse,
+                            TimeUnit timeUnit,
+                            int retryAttempts)
                             throws DeviceNotAvailableException {
-                String fakeRep = expectedOutput;
-                receiver.addOutput(fakeRep.getBytes(), 0, fakeRep.getBytes().length);
-            }
-            @Override
-            public int getApiLevel() throws DeviceNotAvailableException {
-                return 22;
-            }
-        };
+                        String fakeRep = expectedOutput;
+                        receiver.addOutput(fakeRep.getBytes(), 0, fakeRep.getBytes().length);
+                    }
+
+                    @Override
+                    public int getApiLevel() throws DeviceNotAvailableException {
+                        return 22;
+                    }
+                };
 
         // FIXME: this isn't actually causing a DeviceNotAvailableException to be thrown
-        mMockRecovery.recoverDevice(EasyMock.eq(mMockStateMonitor), EasyMock.eq(false));
-        EasyMock.expectLastCall().andThrow(new DeviceNotAvailableException("test", "serial"));
-        EasyMock.replay(mMockRecovery, mMockIDevice);
-        assertEquals(expectedOutput, StreamUtil.getStringFromStream(
-                mTestDevice.getBugreport().createInputStream()));
+        doThrow(new DeviceNotAvailableException("test", "serial"))
+                .when(mMockRecovery)
+                .recoverDevice(Mockito.eq(mMockStateMonitor), Mockito.eq(false));
+
+        assertEquals(
+                expectedOutput,
+                StreamUtil.getStringFromStream(mTestDevice.getBugreport().createInputStream()));
     }
 
     @Test
@@ -1179,14 +1197,13 @@
                         return null;
                     }
                 };
-        EasyMock.replay(mMockRecovery, mMockIDevice);
+
         assertEquals(0, mTestDevice.getBugreport().size());
-        EasyMock.verify(mMockRecovery, mMockIDevice);
     }
 
     @Test
     public void testGetBugreport_deviceUnavail_fallback() throws Exception {
-        final IFileEntry fakeEntry = EasyMock.createMock(IFileEntry.class);
+        final IFileEntry fakeEntry = mock(IFileEntry.class);
         mTestDevice =
                 new TestableAndroidNativeDevice() {
                     @Override
@@ -1221,14 +1238,13 @@
                 };
         List<IFileEntry> list = new ArrayList<>();
         list.add(fakeEntry);
-        EasyMock.expect(fakeEntry.getChildren(false)).andReturn(list);
-        EasyMock.expect(fakeEntry.getName()).andReturn("bugreport-NYC-2016-08-17-10-17-00.tmp");
-        EasyMock.replay(fakeEntry, mMockRecovery, mMockIDevice);
+        when(fakeEntry.getChildren(false)).thenReturn(list);
+        when(fakeEntry.getName()).thenReturn("bugreport-NYC-2016-08-17-10-17-00.tmp");
+
         InputStreamSource res = null;
         try {
             res = mTestDevice.getBugreport();
             assertNotNull(res);
-            EasyMock.verify(fakeEntry, mMockRecovery, mMockIDevice);
         } finally {
             StreamUtil.cancel(res);
         }
@@ -1322,7 +1338,7 @@
 
     @Test
     public void testGetBugreportz_fallBack_validation() throws Exception {
-        IFileEntry entryMock = EasyMock.createMock(IFileEntry.class);
+        IFileEntry entryMock = mock(IFileEntry.class);
         mTestDevice =
                 new TestableAndroidNativeDevice() {
                     @Override
@@ -1350,11 +1366,11 @@
                         }
                     }
                 };
-        IFileEntry childNode = EasyMock.createMock(IFileEntry.class);
-        EasyMock.expect(entryMock.getChildren(false)).andReturn(Arrays.asList(childNode));
-        EasyMock.expect(childNode.getName()).andReturn("bugreport-test-partial.zip");
+        IFileEntry childNode = mock(IFileEntry.class);
+        when(entryMock.getChildren(false)).thenReturn(Arrays.asList(childNode));
+        when(childNode.getName()).thenReturn("bugreport-test-partial.zip");
         FileInputStreamSource f = null;
-        EasyMock.replay(entryMock, childNode);
+
         try {
             f = (FileInputStreamSource) mTestDevice.getBugreportz();
             assertNull(f);
@@ -1364,7 +1380,6 @@
                 f.cleanFile();
             }
         }
-        EasyMock.verify(entryMock, childNode);
     }
 
     /**
@@ -1387,12 +1402,11 @@
         File localFile = FileUtil.createTempFile("timezonetest", ".txt");
         try {
             localFile.setLastModified(1470906000000L); // Thu Aug 11 09:00:00 GMT 2016
-            IFileEntry remoteFile = EasyMock.createMock(IFileEntry.class);
-            EasyMock.expect(remoteFile.getDate()).andReturn("2016-08-11");
-            EasyMock.expect(remoteFile.getTime()).andReturn("18:00");
-            EasyMock.replay(remoteFile);
+            IFileEntry remoteFile = mock(IFileEntry.class);
+            when(remoteFile.getDate()).thenReturn("2016-08-11");
+            when(remoteFile.getTime()).thenReturn("18:00");
+
             assertTrue(testDevice.isNewer(localFile, remoteFile));
-            EasyMock.verify(remoteFile);
         } finally {
             FileUtil.deleteFile(localFile);
         }
@@ -1419,13 +1433,12 @@
         File localFile = FileUtil.createTempFile("timezonetest", ".txt");
         try {
             localFile.setLastModified(1470906000000L); // Thu, 11 Aug 2016 09:00:00 GMT
-            IFileEntry remoteFile = EasyMock.createMock(IFileEntry.class);
-            EasyMock.expect(remoteFile.getDate()).andReturn("2016-08-11");
-            EasyMock.expect(remoteFile.getTime()).andReturn("18:15");
-            EasyMock.replay(remoteFile);
+            IFileEntry remoteFile = mock(IFileEntry.class);
+            when(remoteFile.getDate()).thenReturn("2016-08-11");
+            when(remoteFile.getTime()).thenReturn("18:15");
+
             // Should sync because after time offset correction, file is older.
             assertTrue(testDevice.isNewer(localFile, remoteFile));
-            EasyMock.verify(remoteFile);
         } finally {
             FileUtil.deleteFile(localFile);
         }
@@ -1452,12 +1465,11 @@
         File localFile = FileUtil.createTempFile("timezonetest", ".txt");
         try {
             localFile.setLastModified(1470906000000L); // Thu, 11 Aug 2016 09:00:00 GMT
-            IFileEntry remoteFile = EasyMock.createMock(IFileEntry.class);
-            EasyMock.expect(remoteFile.getDate()).andReturn("2016-08-11");
-            EasyMock.expect(remoteFile.getTime()).andReturn("18:10");
-            EasyMock.replay(remoteFile);
+            IFileEntry remoteFile = mock(IFileEntry.class);
+            when(remoteFile.getDate()).thenReturn("2016-08-11");
+            when(remoteFile.getTime()).thenReturn("18:10");
+
             assertFalse(testDevice.isNewer(localFile, remoteFile));
-            EasyMock.verify(remoteFile);
         } finally {
             FileUtil.deleteFile(localFile);
         }
@@ -1467,12 +1479,13 @@
     @Test
     public void testGetBuildAlias() throws DeviceNotAvailableException {
         final String alias = "alias\n";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String getProperty(String name) throws DeviceNotAvailableException {
-                return alias;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String getProperty(String name) throws DeviceNotAvailableException {
+                        return alias;
+                    }
+                };
         assertEquals(alias, mTestDevice.getBuildAlias());
     }
 
@@ -1481,16 +1494,18 @@
     public void testGetBuildAlias_null() throws DeviceNotAvailableException {
         final String alias = null;
         final String buildId = "alias\n";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String getProperty(String name) throws DeviceNotAvailableException {
-                return alias;
-            }
-            @Override
-            public String getBuildId() throws DeviceNotAvailableException {
-                return buildId;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String getProperty(String name) throws DeviceNotAvailableException {
+                        return alias;
+                    }
+
+                    @Override
+                    public String getBuildId() throws DeviceNotAvailableException {
+                        return buildId;
+                    }
+                };
         assertEquals(buildId, mTestDevice.getBuildAlias());
     }
 
@@ -1499,16 +1514,18 @@
     public void testGetBuildAlias_empty() throws DeviceNotAvailableException {
         final String alias = "";
         final String buildId = "alias\n";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String getProperty(String name) throws DeviceNotAvailableException {
-                return alias;
-            }
-            @Override
-            public String getBuildId() throws DeviceNotAvailableException {
-                return buildId;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String getProperty(String name) throws DeviceNotAvailableException {
+                        return alias;
+                    }
+
+                    @Override
+                    public String getBuildId() throws DeviceNotAvailableException {
+                        return buildId;
+                    }
+                };
         assertEquals(buildId, mTestDevice.getBuildAlias());
     }
 
@@ -1516,12 +1533,13 @@
     @Test
     public void testGetBuildId() throws DeviceNotAvailableException {
         final String buildId = "299865";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String getProperty(String name) throws DeviceNotAvailableException {
-                return buildId;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String getProperty(String name) throws DeviceNotAvailableException {
+                        return buildId;
+                    }
+                };
         assertEquals(buildId, mTestDevice.getBuildId());
     }
 
@@ -1529,12 +1547,13 @@
     @Test
     public void testGetBuildId_null() throws DeviceNotAvailableException {
         final String buildId = null;
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String getProperty(String name) throws DeviceNotAvailableException {
-                return buildId;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String getProperty(String name) throws DeviceNotAvailableException {
+                        return buildId;
+                    }
+                };
         assertEquals(IBuildInfo.UNKNOWN_BUILD_ID, mTestDevice.getBuildId());
     }
 
@@ -1542,12 +1561,13 @@
     @Test
     public void testGetBuildFlavor() throws DeviceNotAvailableException {
         final String flavor = "ham-user";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String getProperty(String name) throws DeviceNotAvailableException {
-                return flavor;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String getProperty(String name) throws DeviceNotAvailableException {
+                        return flavor;
+                    }
+                };
         assertEquals(flavor, mTestDevice.getBuildFlavor());
     }
 
@@ -1557,20 +1577,21 @@
         final String productName = "prod";
         final String buildType = "buildtype";
         String expected = String.format("%s-%s", productName, buildType);
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String getProperty(String name) throws DeviceNotAvailableException {
-                if ("ro.build.flavor".equals(name)) {
-                    return null;
-                } else if ("ro.product.name".equals(name)) {
-                    return productName;
-                } else if ("ro.build.type".equals(name)) {
-                    return buildType;
-                } else {
-                    return null;
-                }
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String getProperty(String name) throws DeviceNotAvailableException {
+                        if ("ro.build.flavor".equals(name)) {
+                            return null;
+                        } else if ("ro.product.name".equals(name)) {
+                            return productName;
+                        } else if ("ro.build.type".equals(name)) {
+                            return buildType;
+                        } else {
+                            return null;
+                        }
+                    }
+                };
         assertEquals(expected, mTestDevice.getBuildFlavor());
     }
 
@@ -1579,20 +1600,21 @@
     public void testGetBuildFlavor_null() throws DeviceNotAvailableException {
         final String productName = null;
         final String buildType = "buildtype";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public String getProperty(String name) throws DeviceNotAvailableException {
-                if ("ro.build.flavor".equals(name)) {
-                    return "";
-                } else if ("ro.product.name".equals(name)) {
-                    return productName;
-                } else if ("ro.build.type".equals(name)) {
-                    return buildType;
-                } else {
-                    return null;
-                }
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public String getProperty(String name) throws DeviceNotAvailableException {
+                        if ("ro.build.flavor".equals(name)) {
+                            return "";
+                        } else if ("ro.product.name".equals(name)) {
+                            return productName;
+                        } else if ("ro.build.type".equals(name)) {
+                            return buildType;
+                        } else {
+                            return null;
+                        }
+                    }
+                };
         assertNull(mTestDevice.getBuildFlavor());
     }
 
@@ -1600,72 +1622,69 @@
     @Test
     public void testDoAdbReboot_emulator() throws Exception {
         final String into = "bootloader";
-        mMockIDevice.reboot(into);
-        EasyMock.expectLastCall();
-        EasyMock.replay(mMockIDevice);
+
         mTestDevice.doAdbReboot(RebootMode.REBOOT_INTO_BOOTLOADER, "");
-        EasyMock.verify(mMockIDevice);
+        verify(mMockIDevice, times(1)).reboot(into);
     }
 
     /** Unit test for {@link NativeDevice#doReboot(RebootMode, String)} ()}. */
     @Test
     public void testDoReboot() throws Exception {
-        NativeDevice testDevice = new NativeDevice(mMockIDevice,
-                mMockStateMonitor, mMockDvcMonitor) {
-            @Override
-            public TestDeviceState getDeviceState() {
-                return TestDeviceState.ONLINE;
-            }
-        };
-        mMockIDevice.reboot(null);
-        EasyMock.expectLastCall();
-        EasyMock.expect(mMockStateMonitor.waitForDeviceNotAvailable(EasyMock.anyLong()))
-                .andReturn(true);
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        NativeDevice testDevice =
+                new NativeDevice(mMockIDevice, mMockStateMonitor, mMockDvcMonitor) {
+                    @Override
+                    public TestDeviceState getDeviceState() {
+                        return TestDeviceState.ONLINE;
+                    }
+                };
+
+        when(mMockStateMonitor.waitForDeviceNotAvailable(Mockito.anyLong())).thenReturn(true);
+
         testDevice.doReboot(RebootMode.REBOOT_FULL, null);
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        verify(mMockIDevice, times(1)).reboot(null);
     }
 
     /** Unit test for {@link NativeDevice#doReboot(RebootMode, String)} ()}. */
     @Test
     public void testDoReboot_skipped() throws Exception {
-        NativeDevice testDevice = new NativeDevice(mMockIDevice,
-                mMockStateMonitor, mMockDvcMonitor) {
-            @Override
-            public TestDeviceState getDeviceState() {
-                mOptions = new TestDeviceOptions() {
+        NativeDevice testDevice =
+                new NativeDevice(mMockIDevice, mMockStateMonitor, mMockDvcMonitor) {
                     @Override
-                    public boolean shouldDisableReboot() {
-                        return true;
+                    public TestDeviceState getDeviceState() {
+                        mOptions =
+                                new TestDeviceOptions() {
+                                    @Override
+                                    public boolean shouldDisableReboot() {
+                                        return true;
+                                    }
+                                };
+                        return TestDeviceState.ONLINE;
                     }
                 };
-                return TestDeviceState.ONLINE;
-            }
-        };
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+
         testDevice.doReboot(RebootMode.REBOOT_FULL, null);
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
     }
 
     /** Unit test for {@link NativeDevice#doReboot(RebootMode, String)} ()}. */
     @Test
     public void testDoReboot_fastboot() throws Exception {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public TestDeviceState getDeviceState() {
-                return TestDeviceState.FASTBOOT;
-            }
-            @Override
-            public CommandResult executeFastbootCommand(String... cmdArgs)
-                    throws DeviceNotAvailableException, UnsupportedOperationException {
-                wasCalled = true;
-                return new CommandResult();
-            }
-        };
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public TestDeviceState getDeviceState() {
+                        return TestDeviceState.FASTBOOT;
+                    }
+
+                    @Override
+                    public CommandResult executeFastbootCommand(String... cmdArgs)
+                            throws DeviceNotAvailableException, UnsupportedOperationException {
+                        wasCalled = true;
+                        return new CommandResult();
+                    }
+                };
+
         mTestDevice.doReboot(RebootMode.REBOOT_FULL, null);
         assertTrue(mTestDevice.wasCalled);
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
     }
 
     /** Unit test for {@link NativeDevice#rebootIntoSideload()}}. */
@@ -1679,13 +1698,11 @@
                     }
                 };
         String into = "sideload";
-        mMockIDevice.reboot(into);
-        EasyMock.expectLastCall();
-        EasyMock.expect(mMockStateMonitor.waitForDeviceInSideload(EasyMock.anyLong()))
-                .andReturn(true);
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+
+        when(mMockStateMonitor.waitForDeviceInSideload(Mockito.anyLong())).thenReturn(true);
+
         testDevice.rebootIntoSideload();
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        verify(mMockIDevice, times(1)).reboot(into);
     }
 
     /** Unit test for {@link NativeDevice#rebootIntoBootloader()}}. */
@@ -1704,14 +1721,12 @@
                     }
                 };
         String into = "bootloader";
-        mMockIDevice.reboot(into);
-        EasyMock.expectLastCall();
-        mMockStateMonitor.setFastbootSerialNumber(MOCK_DEVICE_SERIAL);
-        EasyMock.expect(mMockStateMonitor.waitForDeviceBootloader(EasyMock.anyLong()))
-                .andReturn(true);
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+
+        when(mMockStateMonitor.waitForDeviceBootloader(Mockito.anyLong())).thenReturn(true);
+
         testDevice.rebootIntoBootloader();
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        verify(mMockIDevice, times(1)).reboot(into);
+        verify(mMockStateMonitor).setFastbootSerialNumber(MOCK_DEVICE_SERIAL);
     }
 
     /**
@@ -1741,13 +1756,13 @@
                         return MOCK_DEVICE_SERIAL;
                     }
                 };
-        mMockStateMonitor.setFastbootSerialNumber(MOCK_DEVICE_SERIAL);
-        EasyMock.expect(mMockStateMonitor.waitForDeviceBootloader(EasyMock.anyLong()))
-                .andReturn(true);
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+
+        when(mMockStateMonitor.waitForDeviceBootloader(Mockito.anyLong())).thenReturn(true);
+
         testDevice.rebootIntoBootloader();
         assertTrue(testDevice.wasCalled);
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+
+        verify(mMockStateMonitor).setFastbootSerialNumber(MOCK_DEVICE_SERIAL);
     }
 
     /** Unit test for {@link NativeDevice#rebootIntoFastbootd()}}. */
@@ -1766,14 +1781,12 @@
                     }
                 };
         String into = "fastboot";
-        mMockIDevice.reboot(into);
-        EasyMock.expectLastCall();
-        mMockStateMonitor.setFastbootSerialNumber(MOCK_DEVICE_SERIAL);
-        EasyMock.expect(mMockStateMonitor.waitForDeviceBootloader(EasyMock.anyLong()))
-                .andReturn(true);
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+
+        when(mMockStateMonitor.waitForDeviceBootloader(Mockito.anyLong())).thenReturn(true);
+
         testDevice.rebootIntoFastbootd();
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        verify(mMockIDevice, times(1)).reboot(into);
+        verify(mMockStateMonitor).setFastbootSerialNumber(MOCK_DEVICE_SERIAL);
     }
 
     /**
@@ -1803,136 +1816,153 @@
                         return MOCK_DEVICE_SERIAL;
                     }
                 };
-        mMockStateMonitor.setFastbootSerialNumber(MOCK_DEVICE_SERIAL);
-        EasyMock.expect(mMockStateMonitor.waitForDeviceBootloader(EasyMock.anyLong()))
-                .andReturn(true);
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+
+        when(mMockStateMonitor.waitForDeviceBootloader(Mockito.anyLong())).thenReturn(true);
+
         testDevice.rebootIntoFastbootd();
         assertTrue(testDevice.wasCalled);
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+
+        verify(mMockStateMonitor).setFastbootSerialNumber(MOCK_DEVICE_SERIAL);
     }
 
     /** Unit test for {@link NativeDevice#unlockDevice()} already decrypted. */
     @Test
     public void testUnlockDevice_skipping() throws Exception {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public boolean isEncryptionSupported() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public boolean isDeviceEncrypted() throws DeviceNotAvailableException {
-                return false;
-            }
-        };
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public boolean isEncryptionSupported() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean isDeviceEncrypted() throws DeviceNotAvailableException {
+                        return false;
+                    }
+                };
+
         assertTrue(mTestDevice.unlockDevice());
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
     }
 
     /** Unit test for {@link NativeDevice#unlockDevice()}. */
     @Test
     public void testUnlockDevice() throws Exception {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public boolean isEncryptionSupported() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public boolean isDeviceEncrypted() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public boolean enableAdbRoot() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public String executeShellCommand(String command) throws DeviceNotAvailableException {
-                return "200 checkpw -1";
-            }
-        };
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public boolean isEncryptionSupported() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean isDeviceEncrypted() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean enableAdbRoot() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public String executeShellCommand(String command)
+                            throws DeviceNotAvailableException {
+                        return "200 checkpw -1";
+                    }
+                };
+
         assertTrue(mTestDevice.unlockDevice());
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
     }
 
     /** Unit test for {@link NativeDevice#unlockDevice()}. */
     @Test
     public void testUnlockDevice_garbageOutput() throws Exception {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public boolean isEncryptionSupported() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public boolean isDeviceEncrypted() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public boolean enableAdbRoot() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public String executeShellCommand(String command) throws DeviceNotAvailableException {
-                return "gdsgdgggsgdg not working";
-            }
-        };
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public boolean isEncryptionSupported() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean isDeviceEncrypted() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean enableAdbRoot() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public String executeShellCommand(String command)
+                            throws DeviceNotAvailableException {
+                        return "gdsgdgggsgdg not working";
+                    }
+                };
+
         assertFalse(mTestDevice.unlockDevice());
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
     }
 
     /** Unit test for {@link NativeDevice#unlockDevice()}. */
     @Test
     public void testUnlockDevice_emptyOutput() throws Exception {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public boolean isEncryptionSupported() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public boolean isDeviceEncrypted() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public boolean enableAdbRoot() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public String executeShellCommand(String command) throws DeviceNotAvailableException {
-                return "";
-            }
-        };
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public boolean isEncryptionSupported() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean isDeviceEncrypted() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean enableAdbRoot() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public String executeShellCommand(String command)
+                            throws DeviceNotAvailableException {
+                        return "";
+                    }
+                };
+
         assertFalse(mTestDevice.unlockDevice());
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
     }
 
     /** Unit test for {@link NativeDevice#unlockDevice()}. */
     @Test
     public void testUnlockDevice_goodOutputPasswordEnteredCorrectly() throws Exception {
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public boolean isEncryptionSupported() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public boolean isDeviceEncrypted() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public boolean enableAdbRoot() throws DeviceNotAvailableException {
-                return true;
-            }
-            @Override
-            public String executeShellCommand(String command) throws DeviceNotAvailableException {
-                return "200 encryption 0";
-            }
-        };
-        EasyMock.expect(mMockStateMonitor.waitForDeviceAvailable()).andReturn(mMockIDevice);
-        EasyMock.replay(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public boolean isEncryptionSupported() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean isDeviceEncrypted() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean enableAdbRoot() throws DeviceNotAvailableException {
+                        return true;
+                    }
+
+                    @Override
+                    public String executeShellCommand(String command)
+                            throws DeviceNotAvailableException {
+                        return "200 encryption 0";
+                    }
+                };
+        when(mMockStateMonitor.waitForDeviceAvailable()).thenReturn(mMockIDevice);
+
         assertTrue(mTestDevice.unlockDevice());
-        EasyMock.verify(mMockIDevice, mMockStateMonitor, mMockDvcMonitor);
     }
 
     /**
@@ -1941,8 +1971,9 @@
      */
     @Test
     public void testParseDfOutput_mountWithNumber() {
-        String dfOutput = "Filesystem     1K-blocks   Used Available Use% Mounted on\n" +
-                "/dev/fuse       31154688 100576  31054112   1% /storage/3134-3433";
+        String dfOutput =
+                "Filesystem     1K-blocks   Used Available Use% Mounted on\n"
+                        + "/dev/fuse       31154688 100576  31054112   1% /storage/3134-3433";
         Long res = mTestDevice.parseFreeSpaceFromModernOutput(dfOutput);
         assertNotNull(res);
         assertEquals(31054112L, res.longValue());
@@ -1954,8 +1985,9 @@
      */
     @Test
     public void testParseDfOutput() {
-        String dfOutput = "Filesystem     1K-blocks   Used Available Use% Mounted on\n" +
-                "/dev/fuse       31154688 100576  31054112   1% /storage/sdcard58";
+        String dfOutput =
+                "Filesystem     1K-blocks   Used Available Use% Mounted on\n"
+                        + "/dev/fuse       31154688 100576  31054112   1% /storage/sdcard58";
         Long res = mTestDevice.parseFreeSpaceFromModernOutput(dfOutput);
         assertNotNull(res);
         assertEquals(31054112L, res.longValue());
@@ -1967,8 +1999,9 @@
      */
     @Test
     public void testParseDfOutput_wrongMount() {
-        String dfOutput = "Filesystem     1K-blocks   Used Available Use% Mounted on\n" +
-                "/dev/fuse       31154688 100576  31054112   1% \test\\wrongpath";
+        String dfOutput =
+                "Filesystem     1K-blocks   Used Available Use% Mounted on\n"
+                        + "/dev/fuse       31154688 100576  31054112   1% \test\\wrongpath";
         Long res = mTestDevice.parseFreeSpaceFromModernOutput(dfOutput);
         assertNull(res);
     }
@@ -1979,8 +2012,9 @@
      */
     @Test
     public void testParseDfOutput_filesystemWithNumber() {
-        String dfOutput = "Filesystem     1K-blocks   Used Available Use% Mounted on\n" +
-                "/dev/dm-1       31154688 100576  31054112   1% /";
+        String dfOutput =
+                "Filesystem     1K-blocks   Used Available Use% Mounted on\n"
+                        + "/dev/dm-1       31154688 100576  31054112   1% /";
         Long res = mTestDevice.parseFreeSpaceFromModernOutput(dfOutput);
         assertNotNull(res);
         assertEquals(31054112L, res.longValue());
@@ -2109,12 +2143,13 @@
     @Test
     public void testGetDeviceDescriptor() {
         final String serial = "Test";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public IDevice getIDevice() {
-                return new StubDevice(serial);
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public IDevice getIDevice() {
+                        return new StubDevice(serial);
+                    }
+                };
         DeviceDescriptor desc = mTestDevice.getDeviceDescriptor();
         assertTrue(desc.isStubDevice());
         assertEquals(serial, desc.getSerial());
@@ -2129,12 +2164,12 @@
     public void testPullFile() throws Exception {
         final String fakeRemotePath = "/test/";
         SyncService s = Mockito.mock(SyncService.class);
-        EasyMock.expect(mMockIDevice.getSyncService()).andReturn(s);
-        EasyMock.replay(mMockIDevice);
+        when(mMockIDevice.getSyncService()).thenReturn(s);
+
         File tmpFile = FileUtil.createTempFile("pull", ".test");
         try {
             boolean res = mTestDevice.pullFile(fakeRemotePath, tmpFile);
-            EasyMock.verify(mMockIDevice);
+
             Mockito.verify(s)
                     .pullFile(
                             Mockito.eq(fakeRemotePath),
@@ -2155,8 +2190,8 @@
     public void testPullFile_fails() throws Exception {
         final String fakeRemotePath = "/test/";
         SyncService s = Mockito.mock(SyncService.class);
-        EasyMock.expect(mMockIDevice.getSyncService()).andReturn(s);
-        EasyMock.replay(mMockIDevice);
+        when(mMockIDevice.getSyncService()).thenReturn(s);
+
         File tmpFile = FileUtil.createTempFile("pull", ".test");
         doThrow(new SyncException(SyncError.CANCELED))
                 .when(s)
@@ -2166,7 +2201,7 @@
                         Mockito.any(ISyncProgressMonitor.class));
         try {
             boolean res = mTestDevice.pullFile(fakeRemotePath, tmpFile);
-            EasyMock.verify(mMockIDevice);
+
             Mockito.verify(s)
                     .pullFile(
                             Mockito.eq(fakeRemotePath),
@@ -2185,13 +2220,14 @@
     @Test
     public void testPullFile_returnFileSuccess() throws Exception {
         final String fakeRemotePath = "/test/";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public boolean pullFile(String remoteFilePath, File localFile)
-                    throws DeviceNotAvailableException {
-                return true;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public boolean pullFile(String remoteFilePath, File localFile)
+                            throws DeviceNotAvailableException {
+                        return true;
+                    }
+                };
         File res = mTestDevice.pullFile(fakeRemotePath);
         try {
             assertNotNull(res);
@@ -2206,13 +2242,14 @@
     @Test
     public void testPullFile_returnNull() throws Exception {
         final String fakeRemotePath = "/test/";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public boolean pullFile(String remoteFilePath, File localFile)
-                    throws DeviceNotAvailableException {
-                return false;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public boolean pullFile(String remoteFilePath, File localFile)
+                            throws DeviceNotAvailableException {
+                        return false;
+                    }
+                };
         File res = mTestDevice.pullFile(fakeRemotePath);
         try {
             assertNull(res);
@@ -2228,13 +2265,14 @@
     @Test
     public void testPullFileContents_returnFileSuccess() throws Exception {
         final String fakeRemotePath = "/test/";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public boolean pullFile(String remoteFilePath, File localFile)
-                    throws DeviceNotAvailableException {
-                return true;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public boolean pullFile(String remoteFilePath, File localFile)
+                            throws DeviceNotAvailableException {
+                        return true;
+                    }
+                };
         String res = mTestDevice.pullFileContents(fakeRemotePath);
         assertNotNull(res);
     }
@@ -2246,13 +2284,14 @@
     @Test
     public void testPullFileContents_returnNull() throws Exception {
         final String fakeRemotePath = "/test/";
-        mTestDevice = new TestableAndroidNativeDevice() {
-            @Override
-            public boolean pullFile(String remoteFilePath, File localFile)
-                    throws DeviceNotAvailableException {
-                return false;
-            }
-        };
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    public boolean pullFile(String remoteFilePath, File localFile)
+                            throws DeviceNotAvailableException {
+                        return false;
+                    }
+                };
         String res = mTestDevice.pullFileContents(fakeRemotePath);
         assertNull(res);
     }
@@ -2265,12 +2304,12 @@
     public void testPushFile() throws Exception {
         final String fakeRemotePath = "/test/";
         SyncService s = Mockito.mock(SyncService.class);
-        EasyMock.expect(mMockIDevice.getSyncService()).andReturn(s);
-        EasyMock.replay(mMockIDevice);
+        when(mMockIDevice.getSyncService()).thenReturn(s);
+
         File tmpFile = FileUtil.createTempFile("push", ".test");
         try {
             boolean res = mTestDevice.pushFile(tmpFile, fakeRemotePath);
-            EasyMock.verify(mMockIDevice);
+
             Mockito.verify(s)
                     .pushFile(
                             Mockito.eq(tmpFile.getAbsolutePath()),
@@ -2291,8 +2330,8 @@
     public void testPushFile_fails() throws Exception {
         final String fakeRemotePath = "/test/";
         SyncService s = Mockito.mock(SyncService.class);
-        EasyMock.expect(mMockIDevice.getSyncService()).andReturn(s);
-        EasyMock.replay(mMockIDevice);
+        when(mMockIDevice.getSyncService()).thenReturn(s);
+
         File tmpFile = FileUtil.createTempFile("push", ".test");
         doThrow(new SyncException(SyncError.CANCELED))
                 .when(s)
@@ -2302,7 +2341,7 @@
                         Mockito.any(ISyncProgressMonitor.class));
         try {
             boolean res = mTestDevice.pushFile(tmpFile, fakeRemotePath);
-            EasyMock.verify(mMockIDevice);
+
             Mockito.verify(s)
                     .pushFile(
                             Mockito.eq(tmpFile.getAbsolutePath()),
@@ -2321,9 +2360,8 @@
         final String fakePid = "914";
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn(fakePid).when(spy).executeShellCommand("pidof system_server");
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(fakePid, spy.getProcessPid("system_server"));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test get Process pid by process name with adb shell return of extra new line */
@@ -2332,9 +2370,8 @@
         final String fakePid = "914";
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn(fakePid + "\n").when(spy).executeShellCommand("pidof system_server");
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(fakePid, spy.getProcessPid("system_server"));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test get Process pid return null with invalid shell command output */
@@ -2342,9 +2379,8 @@
     public void testGetProcessPidInvalidOutput() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("invalid output").when(spy).executeShellCommand("pidof system_server");
-        EasyMock.replay(mMockIDevice);
+
         assertNull(spy.getProcessPid("system_server"));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test get Process pid return null with shell command empty output */
@@ -2352,9 +2388,8 @@
     public void testGetProcessPidEmptyOutput() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("").when(spy).executeShellCommand("pidof system_server");
-        EasyMock.replay(mMockIDevice);
+
         assertNull(spy.getProcessPid("system_server"));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test get ProcessInfo by process name */
@@ -2367,12 +2402,11 @@
         doReturn("12:07:32").when(spy).executeShellCommand("ps -p " + fakePid + " -o stime=");
         doReturn(fakeCreationTime).when(spy).executeShellCommand("date -d\"12:07:32\" +%s");
         doReturn("system").when(spy).executeShellCommand("stat -c%U /proc/" + fakePid);
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(Integer.parseInt(fakePid), spy.getProcessByName("system_server").getPid());
         assertEquals(
                 Long.parseLong(fakeCreationTime),
                 spy.getProcessByName("system_server").getStartTime());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test get ProcessInfo by process name return null for invalid process */
@@ -2380,9 +2414,8 @@
     public void testGetProcessByNameInvalidProcess() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("").when(spy).executeShellCommand("pidof system_server");
-        EasyMock.replay(mMockIDevice);
+
         assertNull(spy.getProcessByName("system_server"));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test get ProcessInfo by process name return null for invalid process */
@@ -2391,93 +2424,83 @@
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("120").when(spy).executeShellCommand("pidof system_server");
         doReturn("").when(spy).executeShellCommand("ps -p 120 -o stime=");
-        EasyMock.replay(mMockIDevice);
+
         assertNull(spy.getProcessByName("system_server"));
-        EasyMock.verify(mMockIDevice);
     }
 
     @Test
     public void testGetIntProperty() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("123").when(spy).getProperty("ro.test.prop");
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(123, spy.getIntProperty("ro.test.prop", -1));
-        EasyMock.verify(mMockIDevice);
     }
 
     @Test
     public void testGetIntPropertyNotAnIntegerPropertyReturnsDefaultValue() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("not-an-int").when(spy).getProperty("ro.test.prop");
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(-1, spy.getIntProperty("ro.test.prop", -1));
-        EasyMock.verify(mMockIDevice);
     }
 
     @Test
     public void testGetIntPropertyUnknownPropertyReturnsDefaultValue() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn(null).when(spy).getProperty("ro.test.prop");
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(-1, spy.getIntProperty("ro.test.prop", -1));
-        EasyMock.verify(mMockIDevice);
     }
 
     @Test
     public void testGetBooleanPropertyReturnsTrue() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("true").when(spy).getProperty("ro.test.prop");
-        EasyMock.replay(mMockIDevice);
+
         assertTrue(spy.getBooleanProperty("ro.test.prop", false));
-        EasyMock.verify(mMockIDevice);
     }
 
     @Test
     public void testGetBooleanPropertyReturnsFalse() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("no").when(spy).getProperty("ro.test.prop");
-        EasyMock.replay(mMockIDevice);
+
         assertFalse(spy.getBooleanProperty("ro.test.prop", true));
-        EasyMock.verify(mMockIDevice);
     }
 
     @Test
     public void testGetBooleanPropertyUnknownPropertyReturnsDefaultValue() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn(null).when(spy).getProperty("ro.test.prop");
-        EasyMock.replay(mMockIDevice);
+
         assertTrue(spy.getBooleanProperty("ro.test.prop", true));
-        EasyMock.verify(mMockIDevice);
     }
 
     @Test
     public void testGetBooleanPropertyInvalidValueReturnsDefaultValue() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("123").when(spy).getProperty("ro.test.prop");
-        EasyMock.replay(mMockIDevice);
+
         assertTrue(spy.getBooleanProperty("ro.test.prop", true));
-        EasyMock.verify(mMockIDevice);
     }
 
     @Test
     public void testGetProperty_noOutput() throws Exception {
         CommandResult res = new CommandResult(CommandStatus.SUCCESS);
         res.setStdout("\n");
-        EasyMock.expect(
-                        mMockRunUtil.runTimedCmd(
-                                100,
-                                (OutputStream) null,
-                                null,
-                                "adb",
-                                "-s",
-                                "serial",
-                                "shell",
-                                "getprop",
-                                "test"))
-                .andReturn(res);
-        EasyMock.replay(mMockRunUtil, mMockIDevice);
+        when(mMockRunUtil.runTimedCmd(
+                        100,
+                        (OutputStream) null,
+                        null,
+                        "adb",
+                        "-s",
+                        "serial",
+                        "shell",
+                        "getprop",
+                        "test"))
+                .thenReturn(res);
+
         assertNull(mTestDevice.getProperty("test"));
-        EasyMock.verify(mMockRunUtil, mMockIDevice);
     }
 
     /** Test get boot history */
@@ -2496,9 +2519,8 @@
         history.put(1556238008L, "reboot");
         history.put(1556237796L, "reboot");
         history.put(1556237725L, "reboot");
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(history, spy.getBootHistory());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test get empty boot history */
@@ -2506,9 +2528,8 @@
     public void testGetBootHistoryEmpty() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("").when(spy).getProperty(DeviceProperties.BOOT_REASON_HISTORY);
-        EasyMock.replay(mMockIDevice);
+
         assertTrue(spy.getBootHistory().isEmpty());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test get invalid boot history */
@@ -2516,9 +2537,8 @@
     public void testGetBootHistoryInvalid() throws Exception {
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn("invalid output").when(spy).getProperty(DeviceProperties.BOOT_REASON_HISTORY);
-        EasyMock.replay(mMockIDevice);
+
         assertTrue(spy.getBootHistory().isEmpty());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test get boot history since */
@@ -2534,9 +2554,8 @@
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
         Map<Long, String> history = new LinkedHashMap<Long, String>();
         history.put(1556587278L, "kernel_panic");
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(history, spy.getBootHistorySince(1556238009L, TimeUnit.SECONDS));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test {@link NativeDevice#getBootHistorySince(long, TimeUnit)} on an edge condition. */
@@ -2548,10 +2567,9 @@
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
         Map<Long, String> history = new LinkedHashMap<Long, String>();
         history.put(1579678463L, "reboot");
-        EasyMock.replay(mMockIDevice);
+
         // For the same value we should expect it to be part of the reboot.
         assertEquals(history, spy.getBootHistorySince(1579678463, TimeUnit.SECONDS));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test get boot history since */
@@ -2567,9 +2585,8 @@
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
         Map<Long, String> history = new LinkedHashMap<Long, String>();
         history.put(1556587278L, "kernel_panic");
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(history, spy.getBootHistorySince(1556238009000L, TimeUnit.MILLISECONDS));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test deviceSoftRestartedSince */
@@ -2587,14 +2604,13 @@
                                 + "        reboot,,1556237725\n")
                 .when(spy)
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
-        EasyMock.replay(mMockIDevice);
+
         assertFalse(spy.deviceSoftRestartedSince(1559091923L, TimeUnit.SECONDS));
         assertFalse(spy.deviceSoftRestartedSince(1559091923000L, TimeUnit.MILLISECONDS));
         assertFalse(spy.deviceSoftRestartedSince(1559091922L, TimeUnit.SECONDS));
         assertFalse(spy.deviceSoftRestartedSince(1559091922000L, TimeUnit.MILLISECONDS));
         assertTrue(spy.deviceSoftRestartedSince(1559091920L, TimeUnit.SECONDS));
         assertTrue(spy.deviceSoftRestartedSince(1559091920000L, TimeUnit.MILLISECONDS));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test deviceSoftRestartedSince return true with system_server stopped */
@@ -2620,11 +2636,11 @@
                                 + "        reboot,,1556237725\n")
                 .when(spy)
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
-        EasyMock.replay(mMockIDevice);
+
         try {
             spy.deviceSoftRestartedSince(1559091922L, TimeUnit.SECONDS);
         } catch (RuntimeException e) {
-            //expected
+            // expected
             return;
         }
         fail("RuntimeException is expected");
@@ -2645,9 +2661,8 @@
                                 + "        reboot,,1556237725\n")
                 .when(spy)
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
-        EasyMock.replay(mMockIDevice);
+
         assertFalse(spy.deviceSoftRestartedSince(1559091921L, TimeUnit.SECONDS));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test deviceSoftRestartedSince return false with normal reboot */
@@ -2665,9 +2680,8 @@
                                 + "        reboot,,1556237725\n")
                 .when(spy)
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
-        EasyMock.replay(mMockIDevice);
+
         assertTrue(spy.deviceSoftRestartedSince(1559091921L, TimeUnit.SECONDS));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test deviceSoftRestarted given the previous system_server {@link ProcessInfo} */
@@ -2687,10 +2701,9 @@
                                 + "        reboot,,1556237725\n")
                 .when(spy)
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
-        EasyMock.replay(mMockIDevice);
+
         assertTrue(spy.deviceSoftRestarted(prev1));
         assertFalse(spy.deviceSoftRestarted(prev2));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test deviceSoftRestarted return true with system_server stopped */
@@ -2718,11 +2731,11 @@
                                 + "        reboot,,1556237725\n")
                 .when(spy)
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
-        EasyMock.replay(mMockIDevice);
+
         try {
             spy.deviceSoftRestarted(new ProcessInfo("system", 123, "system_server", 1559000000L));
         } catch (RuntimeException e) {
-            //expected
+            // expected
             return;
         }
         fail("Abnormal reboot is detected, RuntimeException is expected");
@@ -2743,11 +2756,10 @@
                                 + "        reboot,,1556237725\n")
                 .when(spy)
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
-        EasyMock.replay(mMockIDevice);
+
         assertFalse(
                 spy.deviceSoftRestarted(
                         new ProcessInfo("system", 123, "system_server", 1559000000L)));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test deviceSoftRestarted return true if system_server restarted after normal reboot */
@@ -2765,11 +2777,10 @@
                                 + "        reboot,,1556237725\n")
                 .when(spy)
                 .getProperty(DeviceProperties.BOOT_REASON_HISTORY);
-        EasyMock.replay(mMockIDevice);
+
         assertTrue(
                 spy.deviceSoftRestarted(
                         new ProcessInfo("system", 123, "system_server", 1559000000L)));
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test validating valid MAC addresses */
@@ -2792,19 +2803,40 @@
     @Test
     public void testGetMacAddress() throws Exception {
         String address = "58:a2:b5:7d:49:24";
-        IDevice device = new StubDevice(MOCK_DEVICE_SERIAL) {
-            @Override
-            public void executeShellCommand(String command, IShellOutputReceiver receiver)
-                    throws TimeoutException, AdbCommandRejectedException,
-                    ShellCommandUnresponsiveException, IOException {
-                receiver.addOutput(address.getBytes(), 0, address.length());
-            }
-        };
-        mMockIDevice.executeShellCommand(EasyMock.anyObject(), EasyMock.anyObject());
-        EasyMock.expectLastCall().andDelegateTo(device).anyTimes();
-        EasyMock.replay(mMockIDevice);
+        IDevice device =
+                new StubDevice(MOCK_DEVICE_SERIAL) {
+                    @Override
+                    public void executeShellCommand(String command, IShellOutputReceiver receiver)
+                            throws TimeoutException, AdbCommandRejectedException,
+                                    ShellCommandUnresponsiveException, IOException {
+                        receiver.addOutput(address.getBytes(), 0, address.length());
+                    }
+                };
+        mMockIDevice = mock(IDevice.class, AdditionalAnswers.delegatesTo(device));
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    IHostOptions getHostOptions() {
+                        return new HostOptions() {
+                            @Override
+                            public String getNetworkInterface() {
+                                return "en0";
+                            }
+                        };
+                    }
+
+                    @Override
+                    public boolean isAdbTcp() {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean isAdbRoot() throws DeviceNotAvailableException {
+                        return true;
+                    }
+                };
+
         assertEquals(address, mTestDevice.getMacAddress());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test querying a device MAC address when the device is in fastboot */
@@ -2818,33 +2850,55 @@
     /** Test querying a device MAC address but failing to do so */
     @Test
     public void testGetMacAddress_failure() throws Exception {
-        IDevice device = new StubDevice(MOCK_DEVICE_SERIAL) {
-            @Override
-            public void executeShellCommand(String command, IShellOutputReceiver receiver)
-                    throws TimeoutException, AdbCommandRejectedException,
-                    ShellCommandUnresponsiveException, IOException {
-                throw new IOException();
-            }
-        };
-        mMockIDevice.executeShellCommand(EasyMock.anyObject(), EasyMock.anyObject());
-        EasyMock.expectLastCall().andDelegateTo(device).anyTimes();
-        EasyMock.replay(mMockIDevice);
+        IDevice device =
+                new StubDevice(MOCK_DEVICE_SERIAL) {
+                    @Override
+                    public void executeShellCommand(String command, IShellOutputReceiver receiver)
+                            throws TimeoutException, AdbCommandRejectedException,
+                                    ShellCommandUnresponsiveException, IOException {
+                        throw new IOException();
+                    }
+                };
+        mMockIDevice = mock(IDevice.class, AdditionalAnswers.delegatesTo(device));
+        mTestDevice =
+                new TestableAndroidNativeDevice() {
+                    @Override
+                    IHostOptions getHostOptions() {
+                        return new HostOptions() {
+                            @Override
+                            public String getNetworkInterface() {
+                                return "en0";
+                            }
+                        };
+                    }
+
+                    @Override
+                    public boolean isAdbTcp() {
+                        return true;
+                    }
+
+                    @Override
+                    public boolean isAdbRoot() throws DeviceNotAvailableException {
+                        return true;
+                    }
+                };
+
         assertNull(mTestDevice.getMacAddress());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test querying a device MAC address for a stub device */
     @Test
     public void testGetMacAddress_stubDevice() throws Exception {
         String address = "58:a2:b5:7d:49:24";
-        IDevice device = new StubDevice(MOCK_DEVICE_SERIAL) {
-            @Override
-            public void executeShellCommand(String command, IShellOutputReceiver receiver)
-                    throws TimeoutException, AdbCommandRejectedException,
-                    ShellCommandUnresponsiveException, IOException {
-                receiver.addOutput(address.getBytes(), 0, address.length());
-            }
-        };
+        IDevice device =
+                new StubDevice(MOCK_DEVICE_SERIAL) {
+                    @Override
+                    public void executeShellCommand(String command, IShellOutputReceiver receiver)
+                            throws TimeoutException, AdbCommandRejectedException,
+                                    ShellCommandUnresponsiveException, IOException {
+                        receiver.addOutput(address.getBytes(), 0, address.length());
+                    }
+                };
         mTestDevice =
                 new TestableAndroidNativeDevice() {
                     @Override
@@ -2938,21 +2992,20 @@
         SimpleDateFormat format = new SimpleDateFormat("MM-dd HH:mm:ss.mmm");
         String dateFormatted = format.format(new Date(date));
 
-        mMockIDevice.executeShellCommand(
-                EasyMock.eq(String.format("logcat -v threadtime -t '%s'", dateFormatted)),
-                EasyMock.anyObject());
-        EasyMock.replay(mMockIDevice);
         InputStreamSource res = mTestDevice.getLogcatSince(date);
         StreamUtil.close(res);
-        EasyMock.verify(mMockIDevice);
+
+        verify(mMockIDevice)
+                .executeShellCommand(
+                        Mockito.eq(String.format("logcat -v threadtime -t '%s'", dateFormatted)),
+                        Mockito.any());
     }
 
     @Test
     public void testGetProductVariant() throws Exception {
         setGetPropertyExpectation(DeviceProperties.VARIANT, "variant");
-        EasyMock.replay(mMockIDevice);
+
         assertEquals("variant", mTestDevice.getProductVariant());
-        EasyMock.verify(mMockIDevice);
     }
 
     @Test
@@ -2997,14 +3050,11 @@
         OutputStream stdout = null, stderr = null;
         CommandResult res = new CommandResult();
         res.setStatus(CommandStatus.SUCCESS);
-        EasyMock.expect(
-                        mMockRunUtil.runTimedCmd(
-                                100, stdout, stderr, "adb", "-s", "serial", "shell", "some",
-                                "command"))
-                .andReturn(res);
-        EasyMock.replay(mMockRunUtil, mMockIDevice);
+        when(mMockRunUtil.runTimedCmd(
+                        100, stdout, stderr, "adb", "-s", "serial", "shell", "some", "command"))
+                .thenReturn(res);
+
         assertNotNull(mTestDevice.executeShellV2Command("some command"));
-        EasyMock.verify(mMockRunUtil, mMockIDevice);
     }
 
     /**
@@ -3017,20 +3067,19 @@
         CommandResult res = new CommandResult();
         res.setStatus(CommandStatus.TIMED_OUT);
         res.setStderr("timed out");
-        EasyMock.expect(
-                        mMockRunUtil.runTimedCmd(
-                                200L, stdout, stderr, "adb", "-s", "serial", "shell", "some",
-                                "command"))
-                .andReturn(res)
-                .times(2);
-        EasyMock.replay(mMockRunUtil, mMockIDevice);
+        when(mMockRunUtil.runTimedCmd(
+                        200L, stdout, stderr, "adb", "-s", "serial", "shell", "some", "command"))
+                .thenReturn(res);
+
         try {
             mTestDevice.executeShellV2Command("some command", 200L, TimeUnit.MILLISECONDS, 1);
             fail("Should have thrown an exception.");
         } catch (DeviceUnresponsiveException e) {
             // expected
         }
-        EasyMock.verify(mMockRunUtil, mMockIDevice);
+        verify(mMockRunUtil, times(2))
+                .runTimedCmd(
+                        200L, stdout, stderr, "adb", "-s", "serial", "shell", "some", "command");
     }
 
     /**
@@ -3043,19 +3092,18 @@
         CommandResult res = new CommandResult();
         res.setStatus(CommandStatus.FAILED);
         res.setStderr("timed out");
-        EasyMock.expect(
-                        mMockRunUtil.runTimedCmd(
-                                200L, stdout, stderr, "adb", "-s", "serial", "shell", "some",
-                                "command"))
-                .andReturn(res)
-                .times(1);
-        EasyMock.replay(mMockRunUtil, mMockIDevice);
+        when(mMockRunUtil.runTimedCmd(
+                        200L, stdout, stderr, "adb", "-s", "serial", "shell", "some", "command"))
+                .thenReturn(res);
+
         CommandResult result =
                 mTestDevice.executeShellV2Command("some command", 200L, TimeUnit.MILLISECONDS, 1);
         assertNotNull(result);
         // The final result is what RunUtil returned, so it contains full status information.
         assertSame(res, result);
-        EasyMock.verify(mMockRunUtil, mMockIDevice);
+        verify(mMockRunUtil, times(1))
+                .runTimedCmd(
+                        200L, stdout, stderr, "adb", "-s", "serial", "shell", "some", "command");
     }
 
     /** Unit test for {@link INativeDevice#setProperty(String, String)}. */
@@ -3071,20 +3119,18 @@
                 };
         CommandResult res = new CommandResult();
         res.setStatus(CommandStatus.SUCCESS);
-        EasyMock.expect(
-                        mMockRunUtil.runTimedCmd(
-                                120000,
-                                stdout,
-                                stderr,
-                                "adb",
-                                "-s",
-                                "serial",
-                                "shell",
-                                "setprop test 'value'"))
-                .andReturn(res);
-        EasyMock.replay(mMockRunUtil, mMockIDevice);
+        when(mMockRunUtil.runTimedCmd(
+                        120000,
+                        stdout,
+                        stderr,
+                        "adb",
+                        "-s",
+                        "serial",
+                        "shell",
+                        "setprop test 'value'"))
+                .thenReturn(res);
+
         assertTrue(mTestDevice.setProperty("test", "value"));
-        EasyMock.verify(mMockRunUtil, mMockIDevice);
     }
 
     /**
@@ -3184,10 +3230,8 @@
         TestableAndroidNativeDevice spy = Mockito.spy(mTestDevice);
         doReturn(false).when(spy).isAdbRoot();
 
-        EasyMock.replay(mMockIDevice);
         List<File> result = spy.getTombstones();
         assertEquals(0, result.size());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test {@link NativeDevice#getTombstones()}. */
@@ -3202,10 +3246,8 @@
         doReturn(new File("tomb1_test")).when(spy).pullFile("/data/tombstones/tomb1");
         doReturn(new File("tomb2_test")).when(spy).pullFile("/data/tombstones/tomb2");
 
-        EasyMock.replay(mMockIDevice);
         List<File> result = spy.getTombstones();
         assertEquals(2, result.size());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test {@link NativeDevice#getLaunchApiLevel()} with ro.product.first_api_level being set. */
@@ -3219,9 +3261,8 @@
                         return 29;
                     }
                 };
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(23, mTestDevice.getLaunchApiLevel());
-        EasyMock.verify(mMockIDevice);
     }
 
     /**
@@ -3237,9 +3278,8 @@
                         return 29;
                     }
                 };
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(29, mTestDevice.getLaunchApiLevel());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test {@link NativeDevice#getLaunchApiLevel()} with NumberFormatException be asserted. */
@@ -3253,27 +3293,24 @@
                         return 29;
                     }
                 };
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(29, mTestDevice.getLaunchApiLevel());
-        EasyMock.verify(mMockIDevice);
     }
 
     private void setGetPropertyExpectation(String property, String value) {
         CommandResult stubResult = new CommandResult(CommandStatus.SUCCESS);
         stubResult.setStdout(value);
-        EasyMock.expect(
-                        mMockRunUtil.runTimedCmd(
-                                EasyMock.anyLong(),
-                                (OutputStream) EasyMock.isNull(),
-                                EasyMock.isNull(),
-                                EasyMock.eq("adb"),
-                                EasyMock.eq("-s"),
-                                EasyMock.eq("serial"),
-                                EasyMock.eq("shell"),
-                                EasyMock.eq("getprop"),
-                                EasyMock.eq(property)))
-                .andReturn(stubResult);
-        EasyMock.replay(mMockRunUtil);
+        when(mMockRunUtil.runTimedCmd(
+                        Mockito.anyLong(),
+                        (OutputStream) Mockito.isNull(),
+                        Mockito.isNull(),
+                        Mockito.eq("adb"),
+                        Mockito.eq("-s"),
+                        Mockito.eq("serial"),
+                        Mockito.eq("shell"),
+                        Mockito.eq("getprop"),
+                        Mockito.eq(property)))
+                .thenReturn(stubResult);
     }
 
     /** Test {@link NativeDevice#getFastbootSerialNumber()} with USB adb. */
@@ -3286,9 +3323,8 @@
                         return false;
                     }
                 };
-        EasyMock.replay(mMockIDevice);
+
         assertEquals(MOCK_DEVICE_SERIAL, mTestDevice.getFastbootSerialNumber());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test {@link NativeDevice#getFastbootSerialNumber()} with non-root TCP adb. */
@@ -3304,6 +3340,7 @@
                         receiver.addOutput(address.getBytes(), 0, address.length());
                     }
                 };
+        mMockIDevice = mock(IDevice.class, AdditionalAnswers.delegatesTo(device));
         mTestDevice =
                 new TestableAndroidNativeDevice() {
                     @Override
@@ -3336,12 +3373,8 @@
                         return true;
                     }
                 };
-        mMockIDevice.executeShellCommand(EasyMock.anyObject(), EasyMock.anyObject());
-        EasyMock.expectLastCall().andDelegateTo(device).anyTimes();
-        EasyMock.replay(mMockIDevice);
         assertEquals(
                 "tcp:fe80:0:0:0:230:1bff:feba:8128%en0", mTestDevice.getFastbootSerialNumber());
-        EasyMock.verify(mMockIDevice);
     }
 
     /** Test {@link NativeDevice#getFastbootSerialNumber()} with root TCP adb. */
@@ -3357,6 +3390,7 @@
                         receiver.addOutput(address.getBytes(), 0, address.length());
                     }
                 };
+        mMockIDevice = mock(IDevice.class, AdditionalAnswers.delegatesTo(device));
         mTestDevice =
                 new TestableAndroidNativeDevice() {
                     @Override
@@ -3379,12 +3413,7 @@
                         return true;
                     }
                 };
-
-        mMockIDevice.executeShellCommand(EasyMock.anyObject(), EasyMock.anyObject());
-        EasyMock.expectLastCall().andDelegateTo(device).anyTimes();
-        EasyMock.replay(mMockIDevice);
         assertEquals(
                 "tcp:fe80:0:0:0:230:1bff:feba:8128%en0", mTestDevice.getFastbootSerialNumber());
-        EasyMock.verify(mMockIDevice);
     }
 }
