使用 Mockk 模拟静态 java 方法

新手上路,请多包涵

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

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

示例代码会是什么样子?

原文由 Andrzej Sawoniewicz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 511
2 个回答

除了oleksiyp回答:

2022 年更新:

您必须使用 unmockStatic() 。如果自动解锁不适合您,请阅读其他答案。

在 mockk 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 污染你的代码。

原文由 LeoColman 发布,翻译遵循 CC BY-SA 4.0 许可协议

谨防

如果你调用 mockkSatic() 没有块,不要忘记调用 unmockkStatic() 在调用模拟方法之后。该方法不会自动取消模拟,即使在不调用 mockkStatic() 的不同测试类中,您仍然会获得模拟值,但使用静态方法。

另一种选择是在块内执行模拟方法,然后它将自动取消模拟:

 mockkStatic(Uri::class) {
    every { Uri.parse("http://test/path") } returns Uri("http", "test", "path")
    val uri = Uri.parse("http://test/path")
}

原文由 Tomas Rohovsky 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题