使用 Mockk 模拟静态 Java 方法
2022-08-31 23:46:34
我们目前正在使用java和kotlin项目,慢慢地将整个代码迁移到后者。
是否可以像使用 Mockk 那样模拟静态方法?Uri.parse()
示例代码的外观如何?
我们目前正在使用java和kotlin项目,慢慢地将整个代码迁移到后者。
是否可以像使用 Mockk 那样模拟静态方法?Uri.parse()
示例代码的外观如何?
除了oleksiyp的答案:
您必须使用 .请阅读另一个答案,如果自动取消锁定对您不起作用。unmockStatic()
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
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