Предполагая, что у меня есть функция для тестирования ниже, объявите в файле с именем «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
Существует ли какое-либо обходное решение для этой цели?
UtilsKt
решение издевается над ним на стороне Java, поскольку вы не можете ссылаться на класс UtilsKt
из файлов Kotlin.
@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, возвращающий класс UtilsKt
//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()) } }