Kotest + MockK の組み合わせは Kotlin ではメジャー…かと思いきや検索してみても公式の
にあるような例しか見つかりませんでした。 Mockito で言うところの @Mock や @InjectMocks を使ってモックを差し込みたいんじゃい! ということでサンプルです。
前回の記事 Kotlin で JUnit4 のテストケースを書く のテストコードと同じものを作成しています。
前回のコードと見比べてみると分かる通り、結構似てます(差分)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
package com.github.yukihane.example
import io.kotest.core.spec.style.FunSpec
import io.kotest.datatest.withData
import io.kotest.matchers.shouldBe
import io.kotest.matchers.types.shouldBeSameInstanceAs
import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.InjectMockKs
import io.mockk.impl.annotations.MockK
import io.mockk.mockk
class MyControllerKtTest : FunSpec() {
@MockK
private lateinit var service: MyService
@MockK
private lateinit var outputMapper: MyParamMapper
@InjectMockKs
private lateinit var sut: MyController
data class Param(val input: MyParamDTO, val expected: MyParamDTO)
private val params = listOf(
Param(
MyParamDTO("alice", 16),
MyParamDTO("alice", 17)
),
Param(
MyParamDTO("bob", 32),
MyParamDTO("bob", 33)
)
)
init {
beforeTest {
MockKAnnotations.init(this)
}
context("normal") {
withData<Param>(nameFn = { "${it.input.name} ${it.input.age}" }, params) { param ->
val service: MyService = MyServiceImpl()
val controller = MyController(service, MyParamMapper.INSTANCE)
val res = controller.index(param.input)
res shouldBe param.expected
}
}
context("mocking") {
withData(nameFn = { "${it.input.name} ${it.input.age}" }, params) { param ->
every { outputMapper.convert(any<MyParamDTO>()) } returns mockk()
every { service.execute(any()) } returns mockk()
val exp = mockk<MyParamDTO>()
every { outputMapper.convert(any<MyParam>()) } returns exp
val res = sut.index(param.input)
res shouldBeSameInstanceAs exp
}
}
}
}
|