FragmentActivity 无法通过 ActivityInstrumentationTestCase2 进行测试

2024-03-25

我在针对利用最近发布的 Fragment 支持 API 的 Android 应用程序执行 Android 单元测试时遇到问题。当针对 FragmentActivity 运行测试时,日志中会显示以下错误,并且类无法加载。当针对相同的类(但派生自 Activity 的类)运行时,测试工作正常。这两个类都可以作为应用程序正常工作!这意味着,当简单调用时,它们都会正确显示其布局和功能。支持 jar 是构建路径的一部分并包含在项目中。

我遇到的问题是,利用片段(并支持 pre3.0 android)的唯一方法是利用 FragmentActivity,但如果这排除了自动化测试,那么这个库有什么好处。

4-05 18:00:11.276: WARN/dalvikvm(1095): Class resolved by unexpected DEX: Lcom/example/android/app/FragmentLayoutSupport;(0x406351a0):0x12e5c8 ref [Landroid/support/v4/app/FragmentActivity;] Landroid/support/v4/app/FragmentActivity;(0x406351a0):0x12e440
04-05 18:00:11.276: WARN/dalvikvm(1095): (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification)
04-05 18:00:11.286: WARN/dalvikvm(1095): Unable to resolve superclass of Lcom/example/android/app/FragmentLayoutSupport; (49)
04-05 18:00:11.286: WARN/dalvikvm(1095): Link of class 'Lcom/example/android/app/FragmentLayoutSupport;' failed
04-05 18:00:11.286: ERROR/dalvikvm(1095): Could not find class 'com.example.android.app.FragmentLayoutSupport', referenced from method com.example.android.app.test.FrameLayoutTest.<init>
04-05 18:00:11.286: WARN/dalvikvm(1095): VFY: unable to resolve const-class 131 (Lcom/example/android/app/FragmentLayoutSupport;) in Lcom/example/android/app/test/FrameLayoutTest;

这是我为演示该问题而构建的代码。测试用例只是尝试实例化被测试的类:

FrameLayoutTest.java    
public class FrameLayoutTest extends
            ActivityInstrumentationTestCase2<FragmentLayoutSupport> {
        public FrameLayoutTest() {
            super(FragmentLayoutSupport.class);
        }

    public void testActivityTestCaseSetUpProperly() {
        assertNotNull("activity should be launched successfully", getActivity());
    }
}

我创建的两个类如下,fragment_layout是一个空的LinearLayout:

FrameLayout.java
public class FragmentLayout extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_layout);
    }
}

And

FragmentLayoutSupport.java
public class FragmentLayoutSupport extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_layout);
    }
}

为此我折腾了半个晚上,终于找到了解决办法。关键行是:

04-05 18:00:11.276, (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification). 

问题是您在测试项目中使用的 android-support-v4.jar 与您的应用程序项目中的不同。从测试项目中删除对 android-support-v4.jar 的所有引用。然后转到您的应用程序项目 Properties->Java Build Path->Order and Export 并选中 android-support-v4.jar 将其导出。现在两个项目都将使用相同的库,dalvik 不会抱怨。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FragmentActivity 无法通过 ActivityInstrumentationTestCase2 进行测试 的相关文章

随机推荐