使用 Mockk 模拟静态 Java 方法

2022-08-31 23:46:34

我们目前正在使用java和kotlin项目,慢慢地将整个代码迁移到后者。

是否可以像使用 Mockk 那样模拟静态方法?Uri.parse()

示例代码的外观如何?


答案 1

除了oleksiyp的答案:

2022年更新:

您必须使用 .请阅读另一个答案,如果自动取消锁定对您不起作用。unmockStatic()

在模拟 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每次调用它时都会被清除,因此您不再需要取消锁定它


荒废的:

如果您需要该被嘲笑的行为始终存在,而不仅仅是在单个测试用例中,您可以使用 和 来模拟它:@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


答案 2

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


推荐