2016-05-06 72 views
10

我有一個帶有兩個庫模塊的Android Studio項目:foo-modulebar-module。每個實現一個庫,根據foo-module定義一個策略接口並且定義一個策略接口並且執行這種策略。 foo-module有儀器測試(foo-module/src/androidTest/)以使用存根策略實施來測試其核心代碼,並且bar-module應該具有其自己的儀器測試。我們如何在Android庫模塊中繼承測試類?

我在foo-module/src/androidTest/中定義了一個AbstractTests類,它可以完成大部分的實際測試。我在foo-module/src/androidTest/中也有一個StubTests類,它擴展了AbstractTests並實現了必要的abstract方法來完成測試用例(提供策略的實現等)。這一切都很好。

bar-module/src/androidTest/中,我創建了一個BarStrategyTests類,旨在鏡像StubTests,但提供了在bar-module中實施的策略。但是,BarStrategyTests看不到AbstractTests,儘管我的build.gradle文件中有compile project(':foo-module'),而bar-module中的主要(非測試)類可以在foo-module的主要(非測試)類中正常工作。 IOW,而project()依賴項處理常規代碼,但它不處理androidTest/代碼。我得到「錯誤:包com.commonsware.foo.test不存在」。

我試着還加了androidTestCompile project(':foo-module'),結果相同。

在模塊之間共享儀器測試代碼的方法是什麼?

暫時我可以克隆AbstractTests,但這不是一個很好的長期解決方案。

This SO question涵蓋了普通Java的相似之處。有沒有人試過the one answer中的選項,並讓他們爲Android儀器測試工作?第一個選項(將通用測試代碼作爲常規非測試代碼移動到另一個模塊中)看起來似乎合理,但我不知道其他兩個插件是否適用於com.android.library插件而不是java插件。

+0

您是否找到了實現此目的的方法?我想讓我的測試類也可用於其他模塊,但難以共享資源。 – karate

+1

@karate:我正在使用接受的答案中概述的方法。 – CommonsWare

回答

8

由於所有測試類(單元和儀器)不是任何模塊(包括aar)的一部分,因此它們不依賴於該模塊。我也遇到了這個問題,並通過創建test-module並將所有必需的類放入其中(src/main/java)來解決此問題。 因此,您可以在此模塊中移動AbstractTests,並將此模塊用作androidTestCompile依賴項。

+0

如果我依賴於預打包的AAR,比如存儲庫工件,我肯定會看到需要做一些不同的事情。我曾經期望編譯項目(':foo-module')能匹配適當的源代碼集 - 畢竟,它不是'compile projectButJustTheMainSourcesetPlease(':foo-module')'。 :-)我打算讓這個開放一段時間,看看是否有其他人有另一種選擇,但如果你是最好的選擇,我不會感到震驚。謝謝您的幫助! – CommonsWare

+1

請注意,這種方法似乎需要多個附加模塊。基本上,'foo-module'不能有任何自己的測試。不僅'AbstractTests'必須移動到'foo-module-test-common',而且以前在'foo-module'中的任何測試都必須移動到'foo-module-test'。否則,你會得到循環依賴:'foo-module'在'foo-module-test-common'上有'androidTestCompile',它在'foo-module'上有'compile'。作爲結果,'foo-module'不能對'foo-module-test-common'產生依賴。多麼痛苦。 – CommonsWare

+2

那麼,你必須避免'foo-module'依賴於'foo-module-test-common'。一種選擇是將所有測試從'foo-module'移動到'foo-module-test-common',這樣該模塊不僅包含'src/main/java'中的通用測試類,而且還包含'foo 'src/androidTest/java'中的'-module'。 –