使用 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)
}
我正在尝试使用 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)
}