虎視眈々と

Flutter × Firebaseを研究するアプリエンジニア

java.lang.reflect.InvocationTargetExceptionが出た

今日少しハマったのでメモとして残しておく

KotlinでJunitを使ってテストをテストを実行したときに出た

f:id:superman199323:20180907223530p:plain

ググるとリフレクション中にエラーが発生したときに出る例外だそう。

seri.hatenablog.com

でも リフレクションを使ってない

書いていたコードはこんな感じ

  • テストされるコード(本当はこんなコードじゃないけど簡略化しています)
fun isTextEqual(word1: String, word2: String) : Boolean {

        return TextUtils.equals(word1, word2)
}

  • テストコード
@Test
fun `文字列が同じテスト`() {
    val viewModel = MainViewModel()
    assertEquals(viewModel.isTextEqual("テスト1", "テスト1"), true)
}

リフレクション使ってない、、、

解決

どうやら TextUtilsAndroid SDK 上に定義されているコードなのでJunitだけではテストはできません。 ですので、 Roboletics(ろぼれてぃくす) を導入しましょう。

http://robolectric.org/

導入

app/build.gradle に記述

dependencies {
    // dependencies...

    testImplementation 'junit:junit:4.12'
    testImplementation "org.robolectric:robolectric:3.4.2" ←これを書く
}

使う

@RunWith(RobolectricTestRunner::class) ←追加する
class MainViewModelTest {

    @Test
    fun `文字列が同じテスト`() {
        val viewModel = MainViewModel()
        assertEquals(viewModel.isTextEqual("テスト1", "テスト1"), true)
    }
}

@RunWith(RobolectricTestRunner::class) を追加するだけです。 これでテストが通るようになります。