java - 使用 Mockk 模拟静态 java 方法

标签 java unit-testing static kotlin mockk

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

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

示例代码是什么样子的?

最佳答案

除了 oleksiyp 回答:

2022 年更新:

你必须使用 unmockStatic()。如果自动取消模拟对您不起作用,请阅读其他答案。

mock 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 每次调用都会被清空,所以你不再需要 unmock 了


已弃用:

如果您需要模拟的行为始终存在,而不仅仅是在单个测试用例中,您可以使用 @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 污染您的代码。

关于java - 使用 Mockk 模拟静态 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49762409/

相关文章:

c++ - h文件中的静态关键字和内部链接

c++ - 在其声明文件之外使用对象 (C++)

java - Distribution Manifest.mf 中的单个点 (".") 是什么意思?

java - 安卓工作室版本3.1.1

Java改变引用但不改变对象本身?

.net - 垃圾收集器如何处理单元测试?

angular - 无法读取未定义的属性 '_lastPathIndex'

unit-testing - 在 Selenium 中定义自定义操作

java - 模拟静态方法在较新的 mockito-core 版本中不起作用

java - 将来我可以在客户端-服务器数据库环境中使用嵌入式 Derby 数据库吗?