如何使用 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())
}
}
假设我下面有一个函数要测试,在名为"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())
}
}