LoginSignup
3
1

More than 3 years have passed since last update.

[SpringTest] MockkでBeanをMock(Spy)化する

Last updated at Posted at 2021-06-20

はじめに

SpringBootTestでControllerの単体テストを記述する際にService層のクラスの一部の関数をMock化する例です。
Mockkの解説ページにBeanのMock化手法が載っていなかったのでやり方を調べてみました。

バージョン等

SpringFrameWork: 2.2.6
Mockk:1.11.0

ソースコード例

Service.kt
@Service
class Service(
    something: Something
) {
    fun notTargetServiceFunction() : String {
        return "Not target!"
    }

    fun targetServiceFunction() : String {
        return "Not mock!"
    }
}

Service層のクラスは@ServiceアノテーションによりBean化され、DIコンテナに登録されます。

Controller.kt
@RestController
class Controller (
    val service: Service
) {
    @GetMapping("/path")
    fun targetControllerFunction(): ResponseEntity<String> {
        service.targetServiceFunction().let {
            notTargetServiceFunction()
            return ResponseEntity.ok(it)
        }
    }
}

Controllerも@RestControllerアノテーションによりBean化されています。
(省略記法によりserviceの依存性注入も行っている)

Test.kt
class ApplicationTests {

    @Autowired
    private lateinit var webApplicationContext: WebApplicationContext

    lateinit var controllerMockMvc: MockMvc

    @SpykBean
    private lateinit var service: Service

    @BeforeEach
    fun initController() {
        controllerMockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
    }

    @Test
    fun test() {
        every {
            cdcUserService.targetServiceFunction()
        } returns "Mock!"

        val expectedResponse = "Mock!"

        controllerMockMvc.perform(MockMvcRequestBuilders.get(PATH))
            .andExpect(content().string(expectedResponse))
    }
}

Mockkを使用してBean化されシングルトンとして存在するServiceのインスタンスをMock化するには@MockkBeanor@SpykBeanを使用します。
every文のところでMock関数の定義を行っています。
@MockkBean@SpykBeanの違いは全ての関数がMock化されるか、一部の関数だけMock化するかの違いです。
@MockkBeanではevery文で定義しなかった関数は何も返さない関数に置き換わりますが、
@SpykBeanではevery文で定義しなかった関数はそのままオリジナルの関数の定義を引き継ぎます。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1