为什么在内联创建mockito模拟时我会看到性能提升?

ric*_*lva 4 performance junit android unit-testing mockito

当使用mockito 2时,与使用@Mock注释或在设置方法中实例化它们相比,在内联实例化模拟时,我看到了巨大的性能提升。这对我来说非常令人困惑,因为尽管性能明显提升,但文档中没有任何地方不鼓励内联实例化模拟。所有时间均取自 Android studio 的测试运行器输出,显示执行时间。

我通过一个非常简单的测试创建了一个新项目:

    private val mockBanana: Banana

    private lateinit var cut: Person

    @Before
    fun setup(){
        cut = Person()
    }

    @Test
    fun check(){
        cut.banana = mockBanana

        cut.eat()

        verify(mockBanana).grow()
        verify(mockBanana).harvest()
        verify(mockBanana).peelOff()
        verify(mockBanana).eat()

    }
Run Code Online (Sandbox Code Playgroud)

然后,我只是改变了模拟的创建方式。

慢的方法:在setup中调用mock。需要 400 毫秒

    @Before
    fun setup(){
        mockBanana = mock(Banana::class.java)
        cut = Person()
    }
Run Code Online (Sandbox Code Playgroud)

慢方法:mock注解。需要 430 毫秒

    @Mock
    private lateinit var mockBanana: Banana
Run Code Online (Sandbox Code Playgroud)

快速方法:内联调用mock。需要 25 毫秒

    private val mockBanana: Banana = mock(Banana::class.java)
Run Code Online (Sandbox Code Playgroud)

最初,我认为性能提升是由于每个类仅创建一次模拟,然后在所有测试之间共享,这将是一个大问题。然而,进一步的测试毫无疑问表明这不是原因(我在mockito代码中使用了断点和日志,并且多次创建了模拟。此外,测试之间的模拟引用总是不同的)。

在我开始这项巨大的努力之前,我将重构项目中的所有测试,我想更好地了解性能提升,以确保将来不会出现任何问题。

ric*_*lva 5

事实证明,“性能提升”只是 android studio 在测试执行时间上的误导。我使用 JProfiler 并发现内联方法调用和在设置方法中执行都会导致调用需要Mockito.mock()相同的时间来执行。唯一的区别是在堆栈跟踪中执行调用的位置,所以我假设 android studio 仅在某个点之后开始计数,这导致执行时间非常低。

我还使用 gradle 的内置分析器进行了双重检查,并观察到相同的结果。无论模拟初始化方法如何,测试执行所需的时间都是相同的。