IntelliJでAndroidのテストは実行できるけどPOJOのテストでNoClassDefFoundError
激烈にハマった。かけがえのない数時間が・・・。
Androidのテスト環境は整ったけど、Android依存のテストはいちいちエミュか実機上で実行する前提だからなんだかんだで時間かかる。
それにAndroid依存の部分と疎にすることはコードのメンテナンス性うんぬん(中略)だから、POJOで処理できることはなるべくPOJOにさせたいわけですよ。
追記)もはやこのエントリはゴミ。Robolectric使うべき->Androidのテストツールならこれ!Robolectric導入の儀。
で、
public class HogeActivityTest extends ActivityInstrumentationTestCase2<HogeActivity> {
なテストクラスとおなじところにさらっと
public class FugaTest extends TestCase {
なテストクラスをおいて実行してみたらNoClassDefFoundErrorと来たもんだ。しかもテスト対象のクラスが見つからないんだと。
java.lang.NoClassDefFoundError: com/example/Fuga
こういうのはクラスパス設定系しかねーべ、という念力は働いたけど、どこをどうしたらいいのかさっぱりわからず4,5時間経過。
そのうち、Project Settings > Modules > {androidのテストモジュール} > Dependenciesで設定されているモジュールとかjarとかに”Scope"というのがあることに気づいた。これがなんなのかはあまりよくわからないけどとりあえずいじってみようと!ということで"Provided"->"Compile"に変更してみたら・・・実行できた!!!
いやー、うれしい!こういうのはかけた時間分のよろこびが押し寄せてはあっという間に引いちゃって、結局かけた時間を省みてじっと手を見ちゃうよね!まあ、解決したからいいや!
・・・と思ったら今度はAndroid依存のテストが通らなくなった。。。あっちを立てればこっちが立たず。。
DependenciesのScopeに関してはhttp://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scopeとかを読んでみたけどよくわからなかった。
とにかくいろんな組み合わせを試してみたけどうまくいかない。
もう\(^o^)/オワタとあきらめかけたそのときに、圧倒的閃き・・・!同じモジュールで共存できないならモジュール分ければいいんじゃない!
で、結局pojotestsというPOJO用の新しいモジュールを追加して解決したという。
でもこれ、あとでCI導入したときとか、めんどくさいことになりそうだなー・・・。