如何在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()
上的某些方法调用。
感谢帮助/指南。
答案 0 :(得分:0)
Mockito 2具有“选择加入”机制,可以模拟最终方法或类,请参见here。通过创建包含单行的文件src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
,可以通过模仿扩展机制启用它:
mock-maker-inline
(好吧,该文件必须位于类路径中)。
如果这对您有用,那就完美。如果没有,您可能无能为力。
您看到,检测归结为:处理字节码。通常,使用一个以上的框架来完成工作是不可行的。
含义:为了启用这种模拟,需要对字节码进行操作。而且出于明显的原因,要使两个不同个字节码操作框架很好地共存是一个非常艰巨的挑战。
长话短说:尝试这种扩展机制,当它不起作用时,您必须退后一步并问自己:我打算实现的最终目标到底是什么?!
最有可能的是,您可能不应该浪费时间尝试在ART中运行的事物。