Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Kotlin中模拟静态方法?_Kotlin_Jmockit - Fatal编程技术网

如何在Kotlin中模拟静态方法?

如何在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

我试图在Kotlin中用jMockit模拟静态方法:

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
不是一个选项(实际上它是当前的“解决方案”),因为它会干扰其他测试。