web-dev-qa-db-ja.com

Mock static Java Mockkを使用したメソッド

現在、kotlinプロジェクトでJavaを使用しています。コード全体をゆっくりと後者に移行しています。

Mockkを使用してUri.parse()などの静的メソッドをモックすることはできますか?

サンプルコードはどのように見えますか?

10

MockKは静的なJavaメソッドをモックできます。主な目的はKotlin拡張関数のモックであるため、PowerMockほど強力ではありませんが、それでもJava静的メソッド。

構文は次のとおりです。

staticMockk<Uri>().use {
    every { Uri.parse("http://test/path") } returns Uri("http", "test", "path")

    assertEquals(Uri("http", "test", "path"), Uri.parse("http://test/path"))

    verify { Uri.parse("http://test/path") }  
}

詳細はこちら: http://mockk.io/#extension-functions

10
oleksiyp

Oleksiypの答えに加えて:

モック1.8.1以降:

Mockkバージョン1.8.1は、以下のソリューションを非推奨にしました。そのバージョンの後、あなたはすべきです:

@Before
fun mockAllUriInteractions() {
    mockkStatic(Uri::class)
    every { Uri.parse("http://test/path") } returns Uri("http", "test", "path")
}

mockkStaticは呼び出されるたびにクリアされるため、モックを解除する必要はありません


非推奨:

1つのテストケースだけでなく、常にその模擬動作が必要な場合は、@Beforeおよび@Afterを使用して模擬動作を実行できます。

@Before
fun mockAllUriInteractions() {
    staticMockk<Uri>().mock()
    every { Uri.parse("http://test/path") } returns Uri("http", "test", "path")    //This line can also be in any @Test case
}

@After
fun unmockAllUriInteractions() {
    staticMockk<Uri>().unmock()
}

このように、クラスのより多くの部分でUriクラスを使用することが予想される場合、コードをどこでも.useで汚染するのではなく、1つの場所でモックすることができます。

19
Kerooker