Skip to content

Instantly share code, notes, and snippets.

@ygrenzinger
Created May 14, 2019 19:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ygrenzinger/d4e02949e0075f0e579e940d80bdbd57 to your computer and use it in GitHub Desktop.
Save ygrenzinger/d4e02949e0075f0e579e940d80bdbd57 to your computer and use it in GitHub Desktop.
Mockk slowness
package com.kata.tetris
import io.mockk.every
import io.mockk.mockk
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
/*
<dependency>
<groupId>io.mockk</groupId>
<artifactId>mockk</artifactId>
<version>1.9</version>
<scope>test</scope>
</dependency>
*/
typealias Foo = String
class FooLoader {
fun allFoos() : List<Foo> {
return listOf("com", "kata", "tetris")
}
}
class RandomFoo(private val fooLoader: FooLoader) {
fun giveFoo() : Foo {
val foos = fooLoader.allFoos()
return foos[(0 until foos.size).random()]
}
}
class MockkSlownessTest {
@Test
fun tooSlow() {
val time = System.currentTimeMillis()
val fooLoader = mockk<FooLoader>()
every { fooLoader.allFoos() } returns listOf("mock","slowness", "test")
println("Time elapsed : ${System.currentTimeMillis() - time} ms")
// Almost 3.5 seconds to init mock
val randomFoo = RandomFoo(fooLoader)
assertThat(randomFoo.giveFoo()).isIn("mock","slowness", "test")
}
}
@oleksiyp
Copy link

oleksiyp commented May 17, 2019

Check the following code:

fun main(args: Array<String>) {
    var t = System.currentTimeMillis()
    ByteBuddyAgent.install()
    ByteBuddy().subclass(Date::class.java).make().load(Thread.currentThread().contextClassLoader)
    println(System.currentTimeMillis() - t)
    t = System.currentTimeMillis()
    for (i in 1..100000) mockk<Date>()
    println(System.currentTimeMillis() - t)
    t = System.currentTimeMillis()
    for (i in 1..100000) mockk<Date>()
    println(System.currentTimeMillis() - t)
    t = System.currentTimeMillis()
    for (i in 1..100000) mockk<Date>()
    println(System.currentTimeMillis() - t)
}

Gives me following answer:

550
1825
532
378

The first number - is the time of subclassing operation in ByteBuddy with all intialization.
Second - is transformation cost + 100000 mocks
And 3, 4 is just 100000 mocks.

So 0,005 ms per mock after class was transformed. But alike 1200 ms to transform.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment