Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Melhore Seus Testes em Kotlin com Mockk

Melhore Seus Testes em Kotlin com Mockk

Angélica Oliveira

May 29, 2019
Tweet

More Decks by Angélica Oliveira

Other Decks in Programming

Transcript

  1. MOCKS (INTRO) Mocks são uma forma de isolar o sistema

    que está sendo testado dos componentes que este sistema depende. SUT: System Under Test DOC: Depended On Component
  2. class Dependency1(val value1: Int) class Dependency2(val value2: String) class SystemUnderTest(

    val dependency1: Dependency1, val dependency2: Dependency2) { fun calculate() = dependency1.value1 + dependency2.value2.toInt() } MOCKS (INTRO) Exemplo de classe em Kotlin:
  3. @Test fun calculateAddsValues() { val doc1 = mockk<Dependency1>() val doc2

    = mockk<Dependency2>() every { doc1.value1 } returns 5 every { doc2.value2 } returns "6" val sut = SystemUnderTest(doc1, doc2) assertEquals(11, sut.calculate()) } MOCKS (INTRO) Testes usando mocks como dependência:
  4. @Test fun calculateAddsValues() { val doc1 = mockk<Dependency1>() val doc2

    = mockk<Dependency2>() every { doc1.value1 } returns 5 every { doc2.value2 } returns "6" val sut = SystemUnderTest(doc1, doc2) assertEquals(11, sut.calculate()) } MOCKS (INTRO) Testes usando mocks como dependência:
  5. @Test fun calculateAddsValues() { val doc1 = mockk<Dependency1>() val doc2

    = mockk<Dependency2>() every { doc1.value1 } returns 5 every { doc2.value2 } returns "6" val sut = SystemUnderTest(doc1, doc2) assertEquals(11, sut.calculate()) } MOCKS (INTRO) Testes usando mocks como dependência:
  6. @Test fun calculateAddsValues() { val doc1 = mockk<Dependency1>() val doc2

    = mockk<Dependency2>() every { doc1.value1 } returns 5 every { doc2.value2 } returns "6" val sut = SystemUnderTest(doc1, doc2) assertEquals(11, sut.calculate()) } MOCKS (INTRO) Testes usando mocks como dependência:
  7. • Notação nativa de Java • Problemas de nulabilidade •

    Problemas com imutabilidade MOCKITO x KOTLIN
  8. MOCKK • Biblioteca para mocks em Kotlin • Possibilita escrever

    testes de forma mais concisa • Features da linguagem são aproveitadas (lambdas, coroutines…)
  9. EXEMPLOS Argument matchers: every { mock.call(more(5)) } returns 1 every

    { mock.call(or(less(5), eq(5))) } returns -1 any(), isNull(), ofType(type) Lista completa em: https://mockk.io/#matchers
  10. EXEMPLOS Resposta esperada: every { mock1.call(5) } returnsMany listOf(1, 2,

    3) every { mock1.call(5) } returns 1 andThen 2 andThen 3
  11. EXEMPLOS - MOCK DE OBJECTS object MockObj { fun add(a:

    Int, b: Int) = a + b } mockkObject(MockObj) // aplica o mock ao Object assertEquals(3, MockObj.add(1, 2)) every { MockObj.add(1, 2) } returns 55 assertEquals(55, MockObj.add(1, 2))
  12. EXEMPLOS - MOCK DE EXTENSION FUNCTIONS data class Obj(val value:

    Int) // declarado no arquivo File.kt (pacote "pkg") fun Obj.extensionFunc() = value + 5 mockkStatic("pkg.FileKt") every { Obj(5).extensionFunc() } returns 11 assertEquals(11, Obj(5).extensionFunc()) verify { Obj(5).extensionFunc() }
  13. EXEMPLOS - MOCK DE COROUTINES val car = mockk<Car>() coEvery

    { car.drive(Direction.NORTH) } returns Outcome.OK car.drive(Direction.NORTH) // returns OK coVerify { car.drive(Direction.NORTH) }
  14. MOCKK NO ANDROID • Funciona com o uso da dependência

    mockk-android • Compartilhamento entre mocks testImplementation 'io.mockk:mockk:1.9.3' androidTestImplementation 'io.mockk:mockk-android:1.9.3'