如何用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()) } }