Intereting Posts
@CreationTimestamp и @UpdateTimestamp не работают в Котлине Может ли кто-нибудь здесь подробно описать структуру проекта приложения «Котлин / Родник»? Кроме того, особенности работы различных модулей Регулярное выражение, которое распознает / * … * / note Обеспечение инициализации val в Котлине Как проверить общий тип в Kotlin Как вы используете Flowable.generate от Kotlin Анонимные классы с лямбдами в Котлине Как получить страну пользователя для HTTP-запроса в бэкэнд? Как оценивать программу Котлин? Использование RxJava для получения отличного результата с помощью Realm и Retrofit Это применимо для написания драйвера JDBC в Котлине? Ошибка компиляции команды с закрытыми классами Котлин объединяет два изменяемых значения с возможностью смены имени почему kotlin использует === сравнить примитивный тип, равный друг другу, если они имеют одинаковое значение Spring REST, Kotin и примитивные параметры по умолчанию приводят к ошибке

Как насмехаться над объектом Singleton Kotlin?

Учитывая объект Singleton Kotlin и удовольствие, которое вызывает его метод

object SomeObject { fun someFun() {} } fun callerFun() { SomeObject.someFun() } 

Есть ли способ SomeObject.someFun() вызов SomeObject.someFun() ?

Solutions Collecting From Web of "Как насмехаться над объектом Singleton Kotlin?"

Просто сделайте объект реализацией интерфейса, чем вы можете издеваться над объектом с любой насмешливой библиотекой. Вот пример Junit + Mockito + Mockito-Kotlin :

 import com.nhaarman.mockito_kotlin.mock import com.nhaarman.mockito_kotlin.whenever import org.junit.Assert.assertEquals import org.junit.Test object SomeObject : SomeInterface { override fun someFun():String { return "" } } interface SomeInterface { fun someFun():String } class SampleTest { @Test fun test_with_mock() { val mock = mock<SomeInterface>() whenever(mock.someFun()).thenReturn("42") val answer = mock.someFun() assertEquals("42", answer) } } , import com.nhaarman.mockito_kotlin.mock import com.nhaarman.mockito_kotlin.whenever import org.junit.Assert.assertEquals import org.junit.Test object SomeObject : SomeInterface { override fun someFun():String { return "" } } interface SomeInterface { fun someFun():String } class SampleTest { @Test fun test_with_mock() { val mock = mock<SomeInterface>() whenever(mock.someFun()).thenReturn("42") val answer = mock.someFun() assertEquals("42", answer) } } 

Или в случае, если вы хотите mock SomeObject внутри callerFun :

 import com.nhaarman.mockito_kotlin.mock import com.nhaarman.mockito_kotlin.whenever import org.junit.Assert.assertEquals import org.junit.Test object SomeObject : SomeInterface { override fun someFun():String { return "" } } class Caller(val someInterface: SomeInterface) { fun callerFun():String { return "Test ${someInterface.someFun()}" } } // Example of use val test = Caller(SomeObject).callerFun() interface SomeInterface { fun someFun():String } class SampleTest { @Test fun test_with_mock() { val mock = mock<SomeInterface>() val caller = Caller(mock) whenever(mock.someFun()).thenReturn("42") val answer = caller.callerFun() assertEquals("Test 42", answer) } } , import com.nhaarman.mockito_kotlin.mock import com.nhaarman.mockito_kotlin.whenever import org.junit.Assert.assertEquals import org.junit.Test object SomeObject : SomeInterface { override fun someFun():String { return "" } } class Caller(val someInterface: SomeInterface) { fun callerFun():String { return "Test ${someInterface.someFun()}" } } // Example of use val test = Caller(SomeObject).callerFun() interface SomeInterface { fun someFun():String } class SampleTest { @Test fun test_with_mock() { val mock = mock<SomeInterface>() val caller = Caller(mock) whenever(mock.someFun()).thenReturn("42") val answer = caller.callerFun() assertEquals("Test 42", answer) } } 

Недостаточно манипулировать байтовым кодом, ответ – нет, если вы не хотите и не можете изменить код. Самый простой способ (и способ, который я рекомендовал бы), чтобы callerFun вызов SomeObject.someFun() для SomeObject.someFun() , должен обеспечить некоторый способ SomeObject.someFun() его макет объекта.

например

 object SomeObject { fun someFun() {} } fun callerFun() { _callerFun { SomeObject.someFun() } } internal inline fun _callerFun(caller: () -> Unit) { caller() } 

Идея здесь состоит в том, чтобы изменить то, что вы готовы изменить. Если вы уверены, что хотите один синглтон и функцию верхнего уровня, действующие на этом синглетоне, то один из способов, как было продемонстрировано выше, сделать функцию верхнего уровня проверкой без изменения ее публичной подписи – перенести ее реализацию на internal функцию что позволяет скользить макет.