【问题标题】:Mockito performance using spy vs no spy使用间谍与无间谍的 Mockito 性能
【发布时间】:2020-01-08 16:08:33
【问题描述】:

假设我有一个“演示者”:

class Presenter

我将为该类编写多个测试。

创建演示者有两种方式:

1.

class PresenterTests {

    @Test
    fun test_attach() { 
       val presenter = Presenter()

       // presenter.doThings()
       // verify / asserts
    }
}

2.

class PresenterTests {

    @Test
    fun test_attach() { 
       val presenter = spy(Presenter())

       // presenter.doThings()
       // verify / asserts
    }
}

如果我总是对所有对象使用 spy 并在真正需要时检查它们,是否存在任何性能问题?

【问题讨论】:

    标签: android unit-testing jvm mockito


    【解决方案1】:

    我不知道使用 spy() 时有任何显着的性能损失,但如果您监视所有内容,可能会由于其他原因引入意外或不需要的行为。

    来自Javadoc for spy()

    Mockito 将调用委托给传递的真实实例,而是实际创建它的副本。因此,如果您保留真实实例并与之交互,不要指望间谍知道这些交互及其对真实实例状态的影响。推论是,当 在 spy 上调用 unstubbed 方法但不在真实实例上 时,您不会看到对真实实例。

    如果您在任何地方使用spy(),这可能会导致您的测试出现意外行为(取决于它们的编写方式)。

    注意 final 方法。 Mockito 不模拟最终方法,因此底线是:当您监视真实对象时+您尝试存根最终方法=麻烦。您也将无法验证这些方法。

    这是 Mockito 中的一个限制,可能会导致问题。

    另外,有这样一个声明(来自同一个 Javadoc)与监视所有内容的想法背道而驰:

    真正的间谍应谨慎使用,偶尔使用,例如在处理遗留代码时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多