【问题标题】:FragmentActivity can not be tested via ActivityInstrumentationTestCase2FragmentActivity 无法通过 ActivityInstrumentationTestCase2 进行测试
【发布时间】:2011-07-30 12:01:48
【问题描述】:

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

我遇到的问题是,使用 Fragment(并支持 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);
    }
}

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

        setContentView(R.layout.fragment_layout);
    }
}

【问题讨论】:

    标签: android junit android-fragments android-support-library


    【解决方案1】:

    我花了半个晚上,终于找到了解决方案。关键是:

    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 不会抱怨。

    【讨论】:

    • 就是这样。我在调试日志中看到了那行,但它让我失望了。我以为这是说我使用了不同版本的 android-support-v4.jar,而我没有。我猜发生了什么是每个项目的构建以及它自己的 jar 文件链接导致两个唯一编码的 dex 文件。非常棘手,很好解决。如果你使用支持库,我几乎已经准备好放弃片段,因为它们实际上是无法测试的。
    • 你是个救命稻草——这让我难过了三个小时。
    • 你的名字应该是“救生员”
    【解决方案2】:

    Rupert 的 IntelliJ 回答并没有让我一路走好。我通过像 Eclipse 答案建议的那样导出 jar 来解决这个问题。

    文件 > 项目结构 > 模块 > [选择您的主应用] > 依赖项选项卡 > 单击支持 jar 旁边的导出复选框

    【讨论】:

      【解决方案3】:

      对于遇到此问题的任何 IntelliJ 用户,等效的解决方法是将依赖项的范围设置为“已提供”,如下所示:

      文件 > 项目结构 > 模块 > [选择您的测试应用] > 依赖项选项卡 > 在范围下拉菜单中选择“提供”。

      【讨论】:

      • 迁移到 IntelliJ 11.1 后,我的测试停止工作。您的提示有所帮助,谢谢。
      • 我已经尝试了此页面上的所有建议,包括依赖项......没有运气。活动测试无法使用“NoSuchMethod”实例化被测活动...... :-(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      相关资源
      最近更新 更多