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

时间:2017-12-27 03:04:35

标签: kotlin jmockit

假设我有一个要在下面测试的功能,请在名为" 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

是否有针对此目的的解决方法?

2 个答案:

答案 0 :(得分: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());
    }

}

答案 1 :(得分:0)

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

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

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

然后,使用部分模拟

模拟这个类的期望
//UtilsTest.kt
@RunWith(JMockit::class)
class UtilsTest {
    @Test
    fun testDoSomething() {
        object : Expectation(TopLevelFunctionClass.getUtilsClass()) {
            init {
                doSomething()
                result = 2
            }
        }

        assertEquals(2, doSomething())
    }
}