如何使用 jmockit 在 kotlin 中模拟顶级函数

How to mock a top-level-function in kotlin with jmockit

假设我下面有一个函数要测试,在名为"Utils.kt"

的文件中声明
//Utils.kt
fun doSomething() = 1

然后我们创建一个测试class来测试它

//UtilsTest.kt
@RunWith(JMockit::class)
class UtilsTest {
    @Test
    fun testDoSomething() {
        object : Expectation() {
            init {
                doSomething()
                result = 2
            }
        }

        assertEquals(2, doSomething())
    }
}

我想mock doSomething,做成return 2,但是不行,实际结果是1

是否有解决此问题的方法?

解决方法是在 Java 方面模拟它,因为您无法从 Kotlin 文件中引用 UtilsKt class。

@RunWith(JMockit.class)
public final class UtilsFromJavaTest {
    @Test
    public final void testDoSomething(@Mocked @NotNull final UtilsKt mock) {
        new Expectations() {
            {
                UtilsKt.doSomething();
                this.result = 2;
            }
        };
        Assert.assertEquals(2, UtilsKt.doSomething());
    }

}

感谢@aristotll,我们可以简单地扩展解决方法,使其更易于使用。

首先,声明一个 java class 即 return UtilsKt class

//TopLevelFunctionClass.java
public class TopLevelFunctionClass {
    public static Class<UtilsKt> getUtilsClass() {
        return UtilsKt.class
    }
}

然后,使用部分模拟

模拟此 class
//UtilsTest.kt
@RunWith(JMockit::class)
class UtilsTest {
    @Test
    fun testDoSomething() {
        object : Expectation(TopLevelFunctionClass.getUtilsClass()) {
            init {
                doSomething()
                result = 2
            }
        }

        assertEquals(2, doSomething())
    }
}