在我的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但未被列入黑名单的任何想法?
感谢
答案 0 :(得分:1)
在Admob库上创建一个精简抽象层,然后模拟该抽象。
这可能意味着您无法直接将AdView
置于Fragment
/ Activity
布局中。