【发布时间】:2019-12-18 11:24:37
【问题描述】:
使用 mockito 2 时,与使用 @Mock 注释或在 setup 方法中实例化它们相比,内联实例化 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()
}
然后,我只是更改了创建模拟的方式。
Slow 方法:在 setup 中调用 mock。耗时 400 毫秒
@Before
fun setup(){
mockBanana = mock(Banana::class.java)
cut = Person()
}
Slow 方法:模拟注解。耗时 430 毫秒
@Mock
private lateinit var mockBanana: Banana
快速方法:调用模拟内联。耗时 25 毫秒
private val mockBanana: Banana = mock(Banana::class.java)
最初我认为性能提升是由于每个类只创建一次模拟,然后在所有测试之间共享,这将是一个交易破坏者。然而,进一步的测试毫无疑问地表明这不是原因(我在 mockito 代码中使用了断点和日志,并且多次创建了 mock。此外,mock 引用在测试之间总是不同的)。
在我开始努力重构项目中的所有测试之前,我想更好地了解性能提升,以确保将来不会出现任何问题。
【问题讨论】:
-
您可能希望包括您如何测量这些时间。微基准测试很难正确进行。
标签: android performance unit-testing junit mockito