web-dev-qa-db-fra.com

Mock static Java methods using Mockk

Nous travaillons actuellement avec Java avec le projet kotlin, migrant lentement tout le code vers ce dernier.

Est-il possible de se moquer de méthodes statiques comme Uri.parse() en utilisant Mockk?

À quoi ressemblerait l'exemple de code?

10

MockK permet de se moquer des méthodes statiques Java. Le but principal est de se moquer des fonctions d'extension de Kotlin, donc il n'est pas aussi puissant que PowerMock, mais fait toujours son travail même pour Java méthodes statiques.

La syntaxe serait la suivante:

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") }  
}

Plus de détails ici: http://mockk.io/#extension-functions

10
oleksiyp

En plus de la réponse oleksiyp:

Après mockk 1.8.1:

Mockk version 1.8.1 a déprécié la solution ci-dessous. Après cette version, vous devez faire:

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

mockkStatic sera effacé à chaque appel, vous n'avez donc plus besoin de le démocker


obsolète:

Si vous avez besoin que ce comportement simulé soit toujours là, non seulement dans un seul cas de test, vous pouvez le simuler en utilisant @Before et @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()
}

De cette façon, si vous vous attendez à ce que plus de morceaux de votre classe utilisent la classe Uri, vous pouvez vous en moquer en un seul endroit, au lieu de polluer votre code avec .use partout.

19
Kerooker