当前位置: 首页 > 知识库问答 >
问题:

如何模拟Kotlin单例对象?

司信厚
2023-03-14

给定一个Kotlin单例对象和一个调用它的方法的乐趣

object SomeObject {
   fun someFun() {}
}

fun callerFun() {
   SomeObject.someFun()
}

共有1个答案

南门正祥
2023-03-14

只要让你的对象实现一个接口,你就可以用任何模拟库来模拟你的对象。这里是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)
    }
}

或者如果您想在CallerFun中模拟SomeObject:

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)
    }
}
 类似资料:
  • 我试图模拟Scala单例对象。特别是,我需要模拟对象在服务组件(测试中的类)中使用。使用Mockito这是不可能的,测试执行会以以下方式失败: 在这里阅读,Scalamock似乎允许这样做: 要模拟独立的单例对象,请使用。 我的服务组件是这样的: 我的build.sbt有所有这些依赖关系: 但是我找不到这个: 也许这也可以使用EasyMock和PowerMock实现,但我找不到任何Scala示例代

  • 我想测试一个调用对象的类(java中的静态方法调用),但我不能模拟这个对象以避免执行真正的方法。 any()方法来自mockito_kotlin。然后,如果我将一个模拟上下文传递给newIntent方法,则似乎调用了real方法。

  • 我有一个示例方法(我需要编写测试用例)如下所示, 我想模拟getConfig方法并返回一个特定的字符串值。getConfig是Kotlin对象中方法,如下所示, 下面是我尝试的测试 我没有得到任何错误,但是getConfig方法没有被嘲笑。执行实际的实现。我也试过使用Powermockito。请帮帮我

  • 我正在尝试easyMock测试几个类/接口方法。方法,试图捕获参数,但得到一个或另一个错误。如果我只记录了一个期望值,它甚至不会捕获参数管道中的任何内容,如果我使用以下方法,我会得到如下错误代码。 结果是错误的 testFireChannelInitializer(com.obolus.generic.impl.DefaultChannelListenerTest)运行时间:3.812秒 你知道怎

  • 问题内容: 当我创建一个说类Employee的模拟对象时。它不调用Employee对象的构造函数。我知道Mockito在内部使用CGLIb和反射,创建了一个代理类,将该类扩展为模拟。如果未调用employee的构造函数,那么如何创建employee类的模拟实例? 问题答案: Mockito使用CGLib生成类对象。但是,要实例化此类对象,它使用Objenesis http://objenesis.

  • 问题内容: 我最近读到,使类成为单例使不可能模拟该类的对象,这使得测试其客户端变得困难。我无法立即理解其根本原因。有人可以解释一下什么使得模拟单例课程成为不可能吗?另外,使类单例还有其他问题吗? 问题答案: 当然,我可以写一些类似 不使用单例的 东西 ,它们很邪恶,使用Guice / Spring /什么都可以, 但是首先,这不能回答您的问题,其次,当您使用遗留代码 来 处理单例时,例。 因此,我