月: 2021年12月

Mockkでcompanion object内のprivate funを含む関数をテストする

下記のようなクラスがあるとします。

class Calc {
    companion object {
        fun toDouble(num: Int): Int = execute(num)
                private fun execute(num: Int) = num * 2
    }
}

この関数をmockkを使ってテストする場合は下記のように書きます

@RunWith(AndroidJUnit4::class)
class CalcSpec {
    @Before
    fun setUp() {
        mockkObject(Calc)
    }

    @Test
    fun spec() {
      every { Calc invoke "execute" withArguments listOf(ofType<Int>()) } returns 10
      assertThat(Calc.toDouble(1)).isEqualTo(10)
      verify(exactly = 1) { Calc.toDouble(1) }
    }

    @After
    fun tearDown() {
        unmockkAll()
    }
}

mockkObject(Calc)が重要で引数がvararg objects: Anyになっていて一体何を渡すのか…書き方がわからずmockkObject(Calc::class)、mockkObejct(Calc::class.java)にしたり色々試してしまった…。

公式ドキュメントにちゃんと書いてあるので読みましょう。

https://mockk.io/#object-mocks


Androidアプリをビルドすると「Circular dependency between the following tasks:」が表示されビルドできない

AndroidStudioでマルチモジュール構成のアプリを実装中にモジュールの依存関係が循環参照になっているとこのエラーが発生します。循環参照とは簡単に言うと「AモジュールがBモジュールに依存」「BモジュールがCモジュールにモ依存」「CモジュールがAモジュールに依存」している場合等です。ソフトウェアを実行する上では循環参照でも動作してしまう場合もありますが、設計上は良くない設計となっています。

このエラーが表示された場合はモジュールの依存関係を再考する必要があります。