android - 如果存在 AdMob View ,Robolectric 无法扩充布局文件,有什么解决方法吗?

标签 android unit-testing admob android-2.1-eclair robolectric

这是我启用 Robolectric 的 JUnit 测试类的 fragment :

@Before
    public void setUp() throws Exception
    {
        mActivity = new LanguageSelection();
        mActivity.onCreate(null);

        speakEnglishButton = (Button) mActivity.findViewById(com.jameselsey.apps.androidsam.R.id.speakEnglishButton);
        speakSpanishButton = (Button) mActivity.findViewById(com.jameselsey.apps.androidsam.R.id.speakSpanishButton);
        speakFrenchButton = (Button) mActivity.findViewById(com.jameselsey.apps.androidsam.R.id.speakFrenchButton);
        speakGermanButton = (Button) mActivity.findViewById(com.jameselsey.apps.androidsam.R.id.speakGermanButton);
        speakItalianButton = (Button) mActivity.findViewById(com.jameselsey.apps.androidsam.R.id.speakItalianButton);
    }

    @Test
    public void testButtonsVisible()
    {
        assertThat(speakEnglishButton.getVisibility(), equalTo(View.VISIBLE));
        assertThat(speakSpanishButton.getVisibility(), equalTo(View.VISIBLE));
        assertThat(speakFrenchButton.getVisibility(), equalTo(View.VISIBLE));
        assertThat(speakGermanButton.getVisibility(), equalTo(View.VISIBLE));
        assertThat(speakItalianButton.getVisibility(), equalTo(View.VISIBLE));
    }

当我的测试运行时,mActivity.onCreate(null) 行抛出以下异常:

java.lang.RuntimeException: error inflating layout/languageselection
    at com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:101)
    at com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:79)
    at com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:83)
    at com.xtremelabs.robolectric.shadows.ShadowLayoutInflater.inflate(ShadowLayoutInflater.java:33)
    at com.xtremelabs.robolectric.shadows.ShadowLayoutInflater.inflate(ShadowLayoutInflater.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at com.xtremelabs.robolectric.ShadowWrangler.methodInvoked(ShadowWrangler.java:78)
    at com.xtremelabs.robolectric.RobolectricInternals.methodInvoked(RobolectricInternals.java:50)
    at android.view.LayoutInflater.inflate(LayoutInflater.java)
    at com.xtremelabs.robolectric.shadows.ShadowActivity.setContentView(ShadowActivity.java:61)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at com.xtremelabs.robolectric.ShadowWrangler.methodInvoked(ShadowWrangler.java:78)
    at com.xtremelabs.robolectric.RobolectricInternals.methodInvoked(RobolectricInternals.java:50)
    at android.app.Activity.setContentView(Activity.java)
    at com.jameselsey.apps.androidsam.LanguageSelection.onCreate(LanguageSelection.java:28)
    at com.jameselsey.apps.androidsam.LanguageSelectionTest.setUp(LanguageSelectionTest.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at com.xtremelabs.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:164)
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.junit.runners.Suite.runChild(Suite.java:128)
    at org.junit.runners.Suite.runChild(Suite.java:24)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:60)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.xtremelabs.robolectric.res.ViewLoader$ViewNode.constructView(ViewLoader.java:161)
    at com.xtremelabs.robolectric.res.ViewLoader$ViewNode.create(ViewLoader.java:144)
    at com.xtremelabs.robolectric.res.ViewLoader$ViewNode.inflate(ViewLoader.java:126)
    at com.xtremelabs.robolectric.res.ViewLoader$ViewNode.inflate(ViewLoader.java:129)
    at com.xtremelabs.robolectric.res.ViewLoader$ViewNode.inflate(ViewLoader.java:129)
    at com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:99)
    ... 51 more
Caused by: java.lang.UnsupportedOperationException
    at com.xtremelabs.robolectric.util.TestAttributeSet.getAttributeUnsignedIntValue(TestAttributeSet.java:69)
    at com.admob.android.ads.AdView.<init>(AdView.java:366)
    at com.admob.android.ads.AdView.<init>(AdView.java:308)
    at com.admob.android.ads.AdView.<init>(AdView.java:295)
    ... 61 more

如果我从我的 languageselection.xml 布局文件中注释掉以下 View ,它工作得很好:

<com.admob.android.ads.AdView
                android:id="@+id/ad"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="bottom"
                androidsam:backgroundColor="#000000"
                androidsam:primaryTextColor="#FFFFFF"
                androidsam:secondaryTextColor="#CCCCCC"/>

问题:解决这个问题的好方法是什么?我不想纯粹为了测试目的而禁用/启用广告。我不是在测试广告,但我不想为了测试其他元素(例如按钮)而删除它们。

谢谢

最佳答案

我建议移动您从 onCreate 方法中查找 admob 广告的代码 fragment ,并将它们放入 onResume 方法中,该方法在 之后直接调用onCreate.

// Look up the AdView as a resource and load a request.
AdView adView = (AdView) this.findViewById(R.id.adView);

// Request an advertisement
AdRequest request = new AdRequest();
request.setTesting(true); //This is used for testing on emulator. Does not affect production
adView.loadAd(request);

我不确定它为什么会爆炸,但它对我有用。

关于android - 如果存在 AdMob View ,Robolectric 无法扩充布局文件,有什么解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7444444/

相关文章:

java.lang.IllegalStateException 尝试使用 randoop 生成单元测试

android - 通过 XML 设置 AdMob 横幅以匹配父级宽度

ionic-framework - 我可以在 CapacitorJS 应用程序中使用 AdSense 在所有 3 个平台 : Web, iOS 和 Android 上展示广告吗?

java - Android ListView : Do Not Show TextView When Null

java - 无法解析方法 getlatitude()

带有 OnItemClickListener 和 GestureDetector 的 Android ListView

PHP MySQL 函数单元测试

java - robolectric 单元测试 android Timer

Android:如何获取搜索建议

java - 如何让 ADmob 横幅广告显示在 Libgdx 中