2015-01-15 38 views
1

我想在我的單元測試(JUnit 4.12)中使用PowerMock。PowerMock + Mockito + Maven Android應用程序顯示Dex加載器錯誤

我已經有了Mockito,沒有任何問題。 這是一個Android應用程序。

當我運行我的單元測試時,沒有任何問題和靜態函數的模擬完美。

當我在Eclipse中的「播放」按鈕即可運行我的連接在物理機上的應用程序,我收到此錯誤:

[2015-01-15 15:22:22 - Dex Loader] Unable to execute dex: Multiple dex files define Lorg/hamcrest/Description; 
[2015-01-15 15:22:22 - CLAP] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lorg/hamcrest/Description; 

我已閱讀,這意味着PowerMock不支持Delvik VM,但我不明白這意味着什麼,我不相信PowerMock團隊或Mockito團隊沒有找到在Android環境中工作的方式!

這是我在Maven依賴關係PowerMock和

的Mockito
 <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-core</artifactId> 
      <version>1.9.5</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.powermock</groupId> 
      <artifactId>powermock-module-junit4</artifactId> 
      <version>1.6.1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.powermock</groupId> 
      <artifactId>powermock-api-mockito</artifactId> 
      <version>1.6.1</version> 
      <scope>test</scope> 
     </dependency> 

任何人可以幫助我嗎?

編輯

我敢肯定,我需要做的是,當我運行我的應用從我的依賴性刪除PowerMock實(未測試),但我不知道如何去做這個。我使用Eclipse,所以我需要一個可以在這個環境中工作的解決方案。我已經檢查過Maven的配置文件和排除,但我看不到如何實現這一點。我對maven很陌生。任何幫助將不勝感激。另外,當我刪除PowerMock依賴項(以及所有使用它的單元測試)時,項目現在可以在我的設備上運行而沒有問題。

EDIT 2

用命令mvn dependency:list的幫助中的評論所說,我已經發現了這一點:

  • 的JUnit對org.hamcrest的依賴:hamcrest核心: jar:1.3:test
  • PowerMock還對hamcrest庫有依賴關係

看來問題只有在項目中使用的庫的最新版本時纔會發生。我試圖刪除JUnit的依賴,只使用powermock和啓動時的錯誤是一樣的。所以我不認爲這是一個「碰撞」問題,但可能與hammrest版本與powermock的問題?而且我不知道爲什麼它的使用在發射,因爲它是在「測試」範圍......

編輯3 我從與Maven從頭開始創建一個Android項目,看它是否與我的主要應用程序的問題或與Maven合作。問題似乎在Maven或PowerMock依賴中。如果你想嘗試,here is the complete java project。在這個項目中沒有單元測試,我只想在我的Android機器上運行它。我仍然收到完全相同的訊息。

+0

這是器樂或robolectric測試? –

+0

如果您在控制檯'mvn -o dependency:list \ |運行控制檯,您是否看到harmcrest重複的依賴項? grep「:。*:。*:。*」\ | cut -d] -f2- \ | sed's /:[a-z] * $ // g'\ |排序-u' –

+0

這是一個Android應用程序。我使用單元測試(在Windows機器上)。當我運行該應用程序時,它運行在Android設備上。所以我想這不是儀器或roblectric測試(不知道這是什麼) –

回答

1

我終於解決了這個問題,但我不明白一切。非常感謝Eugen Martynov對他的幫助,對this post給了我很大的指導。

問題似乎是Maven在嵌套依賴項中存在重複的.jar文件時遇到的大問題。通過使用班級搜索,我發現了Hamcrest類名「Description」在我的項目中是3次!

因此,我對如何排除Maven中的依賴關係做了一些研究,並發現您可以在Maven Pom編輯器中完成所有這些工作。您可以單擊依賴關係選項卡中的依賴項並執行「刪除」。

問題的其餘部分只是刪除重複Hamcrest依賴項,只有一個在我的項目中。解決這個問題後,第二個庫存在「發育」相同的問題。我做了同樣的修復,終於奏效了。

Eugen Martynov在評論中向我指出,我根本沒有使用Maven。也許這是真的,裸露在我身上!至少現在,我對Maven有了更多的瞭解,並且它完成了我的項目中需要做的事情。

下面是最終依賴代碼:

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.12</version> 
    <exclusions> 
     <exclusion> 
      <artifactId>hamcrest-core</artifactId> 
      <groupId>org.hamcrest</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<dependency> 
    <groupId>org.mockito</groupId> 
    <artifactId>mockito-core</artifactId> 
    <version>1.10.8</version> 
    <scope>test</scope> 
    <exclusions> 
     <exclusion> 
      <artifactId>objenesis</artifactId> 
      <groupId>org.objenesis</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-module-junit4</artifactId> 
    <version>1.6.1</version> 
    <scope>test</scope> 
    <optional>true</optional> 
    <exclusions> 
     <exclusion> 
      <artifactId>junit</artifactId> 
      <groupId>junit</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-api-mockito</artifactId> 
    <version>1.6.1</version> 
    <scope>test</scope> 
    <optional>true</optional> 
    <exclusions> 
     <exclusion> 
      <artifactId>mockito-all</artifactId> 
      <groupId>org.mockito</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 
+0

好,你解決了它。兩條評論:maven沒有嵌套的依賴關係的問題,它只是對重複的依賴關係嚴格的android構建;我鼓勵你學習和使用Gradle(和Android Studio),因爲它受谷歌支持,maven不是(並且eclipse也不會很快) –

+0

謝謝!很快就會看到這個! –

相關問題