2011-04-06 63 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