使用间谍对无间谍的Mockito性能

时间:2020-01-08 16:08:33

标签: android unit-testing jvm 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
    }
}

如果我对所有对象始终使用间谍并且仅在确实需要时检查它们,是否存在性能问题?

1 个答案:

答案 0 :(得分:1)

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

来自Javadoc for spy()

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

如果您在各处使用spy(),则可能会导致测试中出现意外行为-取决于测试的编写方式。

当心最终方法。 Mockito不会模拟最终方法,因此最重要的是:监视真实对象时+尝试对最终方法进行存根=麻烦。另外,您也将无法验证这些方法。

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

此外,有一条来自同一Javadoc的语句,这与监视一切的想法背道而驰:

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