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

假设我有一个函数在下面测试,在名为“Utils.kt”的文件中声明

//Utils.kt fun doSomething() = 1 

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

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

我想嘲弄doSomething ,使它返回2 ,但它不会工作,实际结果是1

有没有解决方法?

一个解决方法在Java端模拟它,因为你不能从Kotlin文件中引用UtilsKt类。

 @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,我们可以简单地扩展解决方法,使其更易于使用。

首先声明一个返回UtilsKt类的java类

 //TopLevelFunctionClass.java public class TopLevelFunctionClass { public static Class 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()) } }