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

标签 android admob mockito ads

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

我在我的 MainActivity 上使用 ActivityInstrumentationTestCase2

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

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

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

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

这会在测试期间产生此跟踪:

     [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,但又不被列入黑名单,有什么想法吗?

谢谢

最佳答案

在 Admob 库上创建一个薄抽象层并模拟该抽象。

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

关于android - 尝试模拟 AdView 类时出现 VirtualMachine 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23029992/

相关文章:

java - 如何使用 Mockito 测试 api?我们需要模拟所有的类变量吗?

android - 网站背景图像在 PC 上运行完美,但它们不会出现在移动设备上

admob - Google Admob实时广告未在真实设备上的iOS 11中展示

flutter - 找不到带有以下内容的广告。原生广告 Flutter google_mobile_ads

flutter - 如何在flutter中使用谷歌移动广告中的关键字

java - 返回 NullPointerException 的模拟方法

java - org.mockito.exceptions.misusing.MissingMethodInitationException

android - 如何打开已经打开的 Activity 而不是创建新 Activity ?

Android CookieManager 设置cookie的安全属性

android - 如何在 Android 中以编程方式更改应用程序图标?