无法通过ActivityInstrumentationTestCase2测试FragmentActivity

sec*_*lpb 28 junit android android-fragments android-support-library

我在使用最近发布的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;
Run Code Online (Sandbox Code Playgroud)

这是我为证明问题而构建的代码.测试用例只是尝试实例化测试中的类:

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

    public void testActivityTestCaseSetUpProperly() {
        assertNotNull("activity should be launched successfully", getActivity());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

        setContentView(R.layout.fragment_layout);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

        setContentView(R.layout.fragment_layout);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*umb 50

我在这上半夜,终于找到了解决方案.关键是:

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

问题是您在测试项目中使用的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文件.非常棘手,很好解决.出于所有实际目的,我几乎已经准备好放弃碎片,如果你使用了支持库,那么它是不可测试的. (5认同)