使用 Mockk 模拟语言环境

Mock Locale using Mockk

我正在尝试使用 Mockk 来模拟对 Locale.getDefault() 的调用,但我似乎无法让它工作。有没有人成功使用 Mockk 来模拟 Locale

我的非常简单的测试class

@Test
fun testName() {
    val defaultLocale = mockk<Locale>()

    mockkStatic(Locale::class)

    every { Locale.getDefault() } returns defaultLocale
}

我得到的错误

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844

无需模拟 Locale,因为它是 Java 框架的一部分,并且会 运行 在单元测试中毫无问题。

package java.util.Locale.java

如果您正在测试各种语言环境,您可以在每次测试 运行 之前设置所需的语言环境,方法是使用语言环境 class 中预定义的国家/地区常量之一调用 Locale#setDefault 或在构造函数中输入语言和国家代码字符串:

setDefault(Locale.US) 
setDefault(Locale.GERMANY)
setDefault(Locale.FRANCE)

// with a language code
val locale = Locale("en-US")

// with a language and country code
val locale = Locale("en", "US") 

Locale.setDefault(locale)

重要

您应该在每次测试 class 完成后重置区域设置,以确保区域设置处于即将进行的下一个测试的预期状态 运行。这可以通过存储 class 进入的语言环境并在所有测试具有 运行 之后恢复到它来维护,使用 @BeforeClass@AfterClass JUnit 方法注释 运行 在 classes 测试之前一次 运行 并且在所有测试之后一次 运行.

private lateinit var storedLocale: Locale

@BeforeClass
fun beforeClass() {
    storedLocale = Locale.getDefault()
}

..
// various tests that manipulate the default locale
..

@AfterClass
fun afterClass() {
     Locale.setDefault(storedLocale)
}