首页 > 解决方案 > 使用间谍与无间谍的 Mockito 性能

问题描述

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

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 并在真正需要时检查它们,是否存在任何性能问题?

标签: androidunit-testingjvmmockito

解决方案


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

来自spy() 的 Javadoc

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

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

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

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

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

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


推荐阅读