【问题标题】:How to mock a new object using mockk如何使用 mockk 模拟新对象
【发布时间】:2019-03-15 12:35:30
【问题描述】:

我正在尝试使用 mockk 编写单元测试。

我正在尝试弄清楚如何模拟对象的新实例。

例如,使用 PowerMockito 我们会这样写:

PowerMockito.whenNew(Dog::class.java).withArguments("beagle").thenReturn(mockDog)

如果我的测试的预期结果是 mockDog,我希望能够断言它等于我的 actualResult:

assertEquals(mockDog, actualResult)

我将如何使用 mockk 完成此任务?

提前致谢。

【问题讨论】:

    标签: kotlin mockk


    【解决方案1】:

    使用mockkConstructor(Dog::class),您可以在 MockK 中模拟构造函数。这将适用于给定类的所有构造函数,无法区分它们。

    可以通过anyConstructed<Dog>()获取mocked类实例。您可以使用它来添加您需要的任何存根和验证,例如:

    every { anyConstructed<Dog>().bark() } just Runs
    

    【讨论】:

    • 这是关于如何处理测试期望的很好的信息,但是它没有回答我关于如何执行断言的问题。如果被测类返回一个实例化对象(actualResult),我希望能够断言它等于创建的模拟对象(expectedResult)。
    • 当我添加这个给我一些错误io.mockk.MockKException: to use anyConstructed&lt;T&gt;() first build mockkConstructor&lt;T&gt;() and 'use' it我们可以添加这样的东西来验证 - verify(exactly = 1) { anyConstructed&lt;PredictionCheckFunction&gt;().check(any())}
    【解决方案2】:

    MockK 是一个用于对代码进行单元测试的库。不要将它用于模拟构造函数。如果您确实需要模拟构造函数,可以使用 PowerMock 模拟构造函数。

    【讨论】:

    • 对于那些只想对被测类而不是其他类进行单元测试的人来说,模拟被测类使用的对象的构造函数是使用模拟的一种非常好的方法。 PowerMockito.whenNew 适用于 java,但 PowerMockito 目前不适用于 Kotlin 配套对象,这就是我将 Mockk 作为替代测试框架的原因。
    猜你喜欢
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2021-03-02
    • 1970-01-01
    相关资源
    最近更新 更多