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

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

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

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

    Просто сделайте объект реализацией интерфейса, чем вы можете издеваться над объектом с любой насмешливой библиотекой. Вот пример 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 функцию что позволяет скользить макет.

    Intereting Posts
    DataBinding не может использоваться в BaseActivity, где я код в Kotlin Javafx by kotlin поступил не так, когда я экспортирую его в runnable jar Как объявить итератор без его инициализации? (Котлин) Как назвать assertEquals с Double Epsilon / Precision в Котлине? Где сохранять статусные файлы? Живые данные MPAndroidChart не отображаются без начальных границ Как вызвать функцию javascript из Kotlin, которая ожидает объект настроек jQuery ajax? Миграция Groovy gradle до градиента Kotlin (исключение отсутствующего или закрытие, не уверен) Как я могу объединить одиночный <Список <Список <T >>> В список <T> с RxJava 2? Spring Injecting util: карта в Котлине с типом безопасности Почему класс kotlin класса не имеет близкого метода? Обработка истекших ссылок при разборе JSON из приложения Android Ошибка: Содержит незаконное финальное поле – Котлин Котлинское умножение между обнуляемыми и невалютными ошибками float даже с нулевой проверкой Горизонтальный LinearLayout в Анко