簡體   English   中英

Android Studio + Robolectric + Gradle Class未找到例外

[英]Android Studio + Robolectric + Gradle Class Not Found Exception

我從https://github.com/robolectric/deckard-gradle下載了Robolectric deckard-gradle項目並導入到Android Studio。

在我第一次跑步時,我得到了

!!! JUnit version 3.8 or later expected:
    java.lang.RuntimeException: Stub!
      at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
      at junit.textui.TestRunner.<init>(TestRunner.java:54)
      at junit.textui.TestRunner.<init>(TestRunner.java:48)
      at junit.textui.TestRunner.<init>(TestRunner.java:41)

錯誤,我從.iml修復此問題。

然后我得到了:

Class Not Found "my test class"

我嘗試了幾十種解決方案,我在谷歌中發現了這個問題,但沒有一個有效。

更新:Android Studio 1.1.0為IDE添加了JUNIT 4測試支持。 有關詳情,請訪問: https//sites.google.com/a/android.com/tools/tech-docs/unit-testing-support 這應該修復STUB異常。

Alex的選項之一是正確答案:我現在在兩個項目中使用它,很遺憾你必須這樣做,但這就是你現在所能做的一切。

詳細步驟如下:

  1. 當顯示STUB EXCEPTION時,將第一條灰線完全復制到編輯器中。
  2. 在這一行中,刪除-classpath之前的所有內容以及最后一個.jar條目之后的所有內容。 (就像亞歷克斯所說的,類路徑,但也刪除其余的后)
  3. 搜索junit並移動類似於以下的行/path/in/filesystem/.gradle/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar:到開頭直接在“-classpath”指令之后的依賴項。
  4. 將測試類輸出目錄添加到類路徑的末尾,如-classpath“/dependency1:/dependency2:/...:/Users/user/path/to/project/app/build/test-classes”
  5. 轉到下拉菜單中的“運行配置”,開始測試或應用程序
  6. 在您的junit測試配置中(您之前嘗試運行,而不是Android測試)將上面的文本添加為​​VM選項。
  7. 按確定,運行測試並瞧,它的工作原理!

順便說一句,為了生成輸出測試源,我必須添加

apply plugin: 'idea'
idea {
    module {
        testOutputDir = file('build/test-classes/debug')
    }
}

到模塊的build.gradle

如果在嘗試使用ui時仍然出現錯誤,請轉到android studio中包含的終端並使用./gradle clean check(或等效命令)對項目和測試運行lint檢查。 如果您的測試出現任何問題,您將收到通知,並可以在html頁面上查看結果。

我正在努力解決同樣的問題,並最終使用此解決方案(適用於Android Studio 1.0.2和Robolectric 2.4):

  • 轉到模塊的* .iml並將帶有jdkType='Android SDK'order-entry移動到所有其他order-entry jdkType='Android SDK'的底部(這將修復“Stub”-issue)。

  • 此外,在* .iml文件中添加以下output-test ,直接進入下面的output -元素。 它應該如下所示:

 <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" /> <output-test url="file://$MODULE_DIR$/build/test-classes" /> 
  • 最后,轉到運行配置Android Studio菜單 - >運行 - >編輯配置
    • 添加一個新的Gradle配置(單擊'+' - >選擇'Gradle'),將其命名為'編譯測試類'(或類似的東西),選擇您的模塊作為Gradle項目(只需使用輸入字段旁邊的圖標即可選擇)並用'compileDebugTestJava'填充任務,點擊'Apply'
    • 現在找到您的JUnit運行配置,並在底部找到“Before launch:Make”部分。 單擊“+”並選擇“運行其他配置”。 選擇“編譯測試類”(或您為Gradle任務設置的名稱),最后但並非最不重要的是在“Make”條目之前移動該條目,該條目應該已經存在。

這對我來說很完美。 現在我可以直接從Android Studio運行測試,而不必操縱類路徑。 這就是為什么我覺得這樣更方便。

問題是Android Studio會經常重寫您的.iml文件,所以即使您修改了它,它也可能會被更改回來。

選項1 :為Android Studio破解它

你可以做的是在測試運行時將類路徑設置為VM選項,並將路徑放到JUnit 4的前面。

在您的測試運行配置中,對於VM選項,添加-classpath然后是JUnit的路徑,然后是類路徑的其余部分(當您嘗試運行測試時,您可以從Android Studio輸出中獲取此信息並且它失敗,它位於第一行您從中復制郵件的輸出。

例如:

-classpath "/Users/anothem/.gradle/caches/artifacts-26/filestore/junit/junit/4.11/jar/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar:[the rest of your classpath]

選項2:使用IntelliJ

這不是一個真正的修復,但我想我會提到它。 如果你真的不想繼續使用Android Studio,你可以使用IntelliJ(Android Studio的“爸爸”)。

使用IntelliJ,您可以打開項目設置,只需重新排序包,以便JUnit4和Robolectric排在其他所有方面。

來自nemo的評論已經指出了它。 您可以修改您的iml文件。 (不好這個文件經常從android studio重寫)我使用自定義gradle任務在android studio中啟用單元測試。 修改iml文件並將路徑更改為測試運行的預期路徑。 有時我必須運行我的測試兩次以使其運行,因為android studio僅在下次測試運行時進行更改,而不是當前。

這是一個完整的示例,可以包含在您的gradle文件中https://github.com/nenick/android-gradle-template/blob/master/Scripts/android-studio-robolectric-support.gradle

因此,為了克服Android Studio問題,幾乎沒有什么可以考慮的事情,但很少有人可以推薦做法。

  1. 確保您使用的是JDK 1.7,目前推薦用於Android開發。 [更正您的設置]
  2. 目前的Robolectric-gradle插件版本1.0.1與android-gradle版本1.1.0兼容[檢查你的build.gradle文件]
  3. 將測試放在“src / test”目錄中,並在APP build.gradle(在'android'中)指定,如下所示:

sourceSets {testLocal {setRoot('src / test')}}

  1. 右鍵單擊“項目”選項卡中的“src / test / java”文件夾,然后單擊“將目錄另存為”>“測試源根”

只是補充一下,我正在使用IDEA社區版,它運行正常。 此外,我不需要破解.iml文件或深入了解IDE內的各種其他設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM