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?
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
En plus de la réponse oleksiyp:
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.