我在使用最近发布的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);
}
}
和
FragmentLayoutSupport.java
public class FragmentLayoutSupport extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_layout);
}
}
答案 0 :(得分:50)
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-&gt; Java Build Path-&gt; Order and Export并检查android-support-v4.jar以将其导出。现在两个项目都将使用相同的库,dalvik不会抱怨。
答案 1 :(得分:4)
鲁珀特的IntelliJ答案并没有让我一路走来。我通过导出jar来解决这个问题,就像建议的Eclipse答案一样。
档案&gt;项目结构&gt;模块&gt; [选择您的主应用]&gt; “依赖项”选项卡&gt;单击支持jar旁边的导出复选框
答案 2 :(得分:3)
对于遇到此问题的任何IntelliJ用户,等效修复是将依赖关系的范围设置为“提供”,如下所示:
档案&gt;项目结构&gt;模块&gt; [选择您的测试应用]&gt; “依赖项”选项卡&gt;在范围下拉列表中选择“提供”。