Android测试,模拟最终课程

时间:2019-01-09 13:52:17

标签: java android mockito powermock powermockito

如何在Android Instrumented测试用例中模拟最终类,即在str_replace("–", "–", "Pirate Code – PVP Battles at Sea Trailer"); 内部模拟最终类?

(我正在使用Android Run Time

我有一个如下的测试用例-

Mockito 2.X

当我在import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.util.Log; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { // This is my app specific NON - Final class private ShutdownServicesReqSig rebootSig = ShutdownServicesReqSig.newBuilder(ShutDownType.REBOOT_SYSTEM).setReason("test").build(); private PowerManager mockedPowerManager = null; private Context mockedContext = null; @Test public void testRestart() throws InterruptedException { mockedContext = Mockito.mock(Context.class); mockedPowerManager = Mockito.mock(PowerManager.class); // Here is the problem android.os.PowerManager is a Final class in latest Android SDK // I need to mock it, only then I can use Mockito.verify() on PowerManager Mockito.when(mockedContext.getSystemService(Context.POWER_SERVICE)).thenReturn(mockedPowerManager); assertTrue(executor.requestShutdown(rebootSig)); Thread.sleep(1000); Mockito.verify(mockedPowerManager).reboot(any(String.class)); // Mocking of PowerManager is essential to be sure of method call on PowerManager, using Mockito.verify Mockito.reset(mockedPowerManager); } } (放置在ART内)上将其作为Android Instrumented Test运行时,出现以下错误-

MyApplication\app\src\androidTest

但是,相同的代码,当我作为普通的JUnit测试运行时,在org.mockito.exceptions.base.MockitoException: Cannot mock/spy class android.os.PowerManager Mockito cannot mock/spy following: - final classes - anonymous classes - primitive types 内(放在-JVM内)运行良好。

我需要在MyApplication\app\src\test中运行它,因为我想测试一些自定义的Android服务,并且我需要模拟ART之类的最终类,因为只有这样我才能使用{{1 }} PowerManager上,以验证Mockito.verify()上的某些方法调用。

感谢帮助/指南。

1 个答案:

答案 0 :(得分:0)

Mockito 2具有“选择加入”机制,可以模拟最终方法或类,请参见here。通过创建包含单行的文件src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker,可以通过模仿扩展机制启用它:

mock-maker-inline

(好吧,该文件必须位于类路径中)。

如果这对您有用,那就完美。如果没有,您可能无能为力。

您看到,检测归结为:处理字节码。通常,使用一个以上的框架来完成工作是不可行的。

含义:为了启用这种模拟,需要对字节码进行操作。而且出于明显的原因,要使两个不同个字节码操作框架很好地共存是一个非常艰巨的挑战。

长话短说:尝试这种扩展机制,当它不起作用时,您必须退后一步并问自己:我打算实现的最终目标到底是什么?!

最有可能的是,您可能不应该浪费时间尝试在ART中运行的事物。