尝试模拟AdView类时出现VirtualMachine错误

时间:2014-04-12 11:48:23

标签: android admob mockito ads

在我的Android应用中,我想测试一些配置然后加载我的广告的活动的方法。

我在MainActivity上使用ActivityInstrumentationTestCase2

为避免在测试期间加载真实的广告,我想模拟这两个类,然后验证它们。

import com.google.ads.AdRequest;
import com.google.ads.AdView;

我使用了mockito,dexmaker和dexmaker-mockito。一切正常,我还使用Emma跟踪代码覆盖率。

然而,似乎在Android的某些版本上,这些类无法被模拟,因为AdView扩展了RelativeLayout,并且它有一些DexMaker无法处理的最终方法。

这会在测试期间产生这种痕迹:

     [exec] Error in testAdWithLocation:
     [exec] java.lang.VirtualMachineError
     [exec]     at dalvik.system.DexFile.defineClass(Native Method)
     [exec]     at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:207)
     [exec]     at dalvik.system.DexFile.loadClass(DexFile.java:196)
     [exec]     at dalvik.system.DexClassLoader.findClass(DexClassLoader.java:226)
     [exec]     at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
     [exec]     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
     [exec]     at com.google.dexmaker.stock.ProxyBuilder.loadClass(ProxyBuilder.java:272)
     [exec]     at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:254)
     [exec]     at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:56)
     [exec]     at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
     [exec]     at org.mockito.internal.MockitoCore.mock(MockitoCore.java:51)
     [exec]     at org.mockito.Mockito.mock(Mockito.java:1243)
     [exec]     at org.mockito.Mockito.mock(Mockito.java:1120)
     [exec]     at net.mackenzie_serres.meteowidget.ui.activities.MainActivityTests.testAdWithLocation(MainActivityTests.java:430)
     [exec]     at java.lang.reflect.Method.invokeNative(Native Method)
     [exec]     at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204)
     [exec]     at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194)
     [exec]     at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186)
     [exec]     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
     [exec]     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
     [exec]     at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
     [exec]     at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)

为了避免这种情况,我能够模拟AdRequest并使用真正的AdView,但我怀疑这是因为我被Google列入黑名单并冻结了我的广告帐户。

有关如何将此测试回到API 9但未被列入黑名单的任何想法?

感谢

1 个答案:

答案 0 :(得分:1)

在Admob库上创建一个精简抽象层,然后模拟该抽象。

这可能意味着您无法直接将AdView置于Fragment / Activity布局中。