如何在Kotlin中模拟静态方法?
我试图在Kotlin中用jMockit模拟静态方法:如何在Kotlin中模拟静态方法?,kotlin,jmockit,Kotlin,Jmockit,我试图在Kotlin中用jMockit模拟静态方法: object: MockUp<System>() { @Mock fun getProperty(name: String) = "tagB" } object:MockUp(){ @嘲弄 fun getProperty(名称:字符串)=“tagB” } 但我得到了以下错误: 无法加载日志管理器“tagB” java.lang.ClassNotFoundException:tagB 位于java.net.URLClas
object: MockUp<System>() {
@Mock
fun getProperty(name: String) = "tagB"
}
object:MockUp(){
@嘲弄
fun getProperty(名称:字符串)=“tagB”
}
但我得到了以下错误:
无法加载日志管理器“tagB”
java.lang.ClassNotFoundException:tagB
位于java.net.URLClassLoader.findClass(URLClassLoader.java:381)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
在java.util.logging.LogManager$1.run(LogManager.java:195)
在java.util.logging.LogManager$1.run(LogManager.java:181)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.util.logging.LogManager。(LogManager.java:181)
位于java.util.logging.Logger.getPlatformLogger(Logger.java:572)
在java.util.logging.LoggingProxyImpl.getLogger(LoggingProxyImpl.java:41)中
位于sun.util.logging.LoggingSupport.getLogger(LoggingSupport.java:100)
位于sun.util.logging.PlatformLogger$JavaLoggerProxy。(PlatformLogger.java:602)
PlatformLogger$JavaLoggerProxy(PlatformLogger.java:597)
在sun.util.logging.PlatformLogger上(PlatformLogger.java:239)
位于sun.util.logging.PlatformLogger.getLogger(PlatformLogger.java:198)
位于sun.util.locale.provider.LocaleServiceProviderPool.config(LocaleServiceProviderPool.java:142)
位于sun.util.locale.provider.LocaleProviderAdapter。(LocaleProviderAdapter.java:165)
位于java.text.DecimalFormatSymbols.getInstance(DecimalFormatSymbols.java:178)
位于java.util.Formatter.getZero(Formatter.java:2283)
位于java.util.Formatter.(Formatter.java:1892)
位于java.util.Formatter。(Formatter.java:1914)
位于java.lang.String.format(String.java:2940)
位于org.junit.runner.Description.formatDisplayName(Description.java:114)
位于org.junit.runner.Description.createTestDescription(Description.java:73)
位于io.kotlintest.TestCase.getDescription(TestCase.kt:45)
位于io.kotlintest.TestBase.description for suite$kotlintest_main(TestBase.kt:153)
位于io.kotlintest.TestBase.getDescription$kotlintest_main(TestBase.kt:39)
位于io.kotlintest.KTestJUnitRunner.getDescription(KTestJUnitRunner.kt:11)
位于com.intellij.junit4.JUnit4IdeaTestRunner.getDescription(JUnit4IdeaTestRunner.java:123)
位于com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:99)
位于com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
位于com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
位于com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
记录配置类“tagB”失败
java.lang.ClassNotFoundException:tagB
其他带有期望块的方法也不成功
如何在Kotlin中模拟静态方法?您应该像这样模拟系统:
class MockSystem : MockUp<System>() {
@Mock
fun getProperty(name: String) = "tagB"
}
class MockTest {
val m = MockSystem();
@Test fun test() {
Assert.assertEquals(System.getProperty("hello"), "tagB")
}
}
类MockSystem:MockUp(){
@嘲弄
fun getProperty(名称:字符串)=“tagB”
}
类模拟测试{
val m=MockSystem();
@测试乐趣测试(){
Assert.assertEquals(System.getProperty(“hello”),“tagB”)
}
}
为什么不重构代码,使其允许通过显式API传递您正在访问的任何值?在这种情况下,没有什么可模仿的:只需调用System.setProperty(…)
@Rogério系统。setProperty
不是一个选项(实际上它是当前的“解决方案”),因为它会干扰其他测试。