gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:23:56 24 4
gpt4 key购买 nike

当使用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()

}

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

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

    @Before
fun setup(){
mockBanana = mock(Banana::class.java)
cut = Person()
}

慢方法:模拟注释。需要 430 毫秒

    @Mock
private lateinit var mockBanana: Banana

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

    private val mockBanana: Banana = mock(Banana::class.java)

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

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

最佳答案

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

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

关于android - 为什么在内联创建mockito模拟时我会看到性能提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59390997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com