2011-04-06 57 views
28

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

我遇到的问题是利用碎片(并支持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); 
    } 
} 

回答

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的支持,v4.jar是从一个应用程序中的项目不同。从测试项目中删除所有对android-support-v4.jar的引用。然后转到您的应用程序项目Properties-> Java Build Path-> Order and Export,并检查android-support-v4.jar以导出它。现在这两个项目将使用相同的库,并且达尔维克不会抱怨。

+5

这正是它。我在调试日志中看到了这一行,但它将我抛弃了。我以为这是说我使用了不同版本的android-support-v4.jar,我没有。我想现在发生的事情是每个项目的构建与它自己的那个jar文件的链接导致了两个唯一编码的dex文件。非常棘手,很好解决。我几乎准备好放弃碎片,因为所有实际目的,如果您使用支持库,则无法检测。 – securelpb 2011-04-15 05:38:42

+1

你是一个拯救生命的人 - 这已经让我陷入了三个小时的困境。 – tomtheguvnor 2011-10-28 17:52:49

+5

为什么不被接受为正确答案? – Bostone 2012-11-16 16:38:53

3

对于谁遇到这个问题相当于解决方法是你的依赖范围设置为“提供”如下任何的IntelliJ用户:

文件>项目结构>模块> [选择测试应用]>依赖选项卡>在范围下拉列表中选择'已提供'。

+0

迁移到IntelliJ 11.1后,我的测试停止工作。你的提示有帮助,谢谢。 – jki 2012-04-04 19:32:56

+0

,帮助..谢谢! – Informatic0re 2013-03-27 11:45:35

+0

我试过这个页面上的所有建议,包括依赖关系......没有运气。活动测试无法使用“NoSuchMethod”实例化测试活动.... :-( – 2013-10-14 00:03:37

4

鲁珀特的IntelliJ答案并没有让我一直在那里。我通过导出jar之类的Eclipse解决方案解决了这个问题。

文件>项目结构>模块> [选择您的主应用程序]>依赖关系标签>点击下一步出口复选框,将支持jar

IntelliJ Project Structure

+1

3小时我正在搜索!!!!!!!!!!!它也适用于Intellijii版本12 – pommedeterresautee 2012-12-17 20:15:31