iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
0
Software Development

Kotlin 島深度之旅 30 天系列 第 28

[Day 28] Kotlin Journey - Kotlin + Spring Boot 第一個 JUnit 測試程式

今天要先來幫昨天寫的 HelloRestController 加上簡單的測試啦

Testing with JUnit 5

Test instance lifecycle

官方有提到因為有時會需要使用到 @BeforeAll 和 @AfterAll 在所有的測試之前初始化,或測試後初始, 因為測試的 class 是這個 class 內每跑一個 test 就會做重新初始,以致於 @BeforeAll 和 @AfterAll 必須要是 static 的。

但在 Kotlin 中 static 的方法還需要宣告成 companion object ,為了避免這樣複雜的使用方式,於是 Junit 5 提供了一個 class 只初始化僅僅一次的方式。

只要測試程式加上這句,就可以放心使用 @BeforeAll 和 @AfterAll 啦~

@TestInstance(TestInstance.Lifecycle.PER_CLASS) 

或是再 src/test/resources/junit-platform.properties 加入這行,這樣測試程式也可以全體適用

junit.jupiter.testinstance.lifecycle.default = per_class

像是這樣

https://ithelp.ithome.com.tw/upload/images/20201008/20129902b85BRvTkRP.png

這裡我們使用了 MockMvc 來做單純的 server 端的測試,也就是假的,不會去撈取 db 資料等等的測試,可以看到在 Kotlin 中推薦使用 check hello (這符號叫做 backticks)這樣的函數命名方式來更清楚的來解釋測試的含義。

//@TestInstance(TestInstance.Lifecycle.PER_CLASS) 這句不加是因為,我已經在設定檔設定了。

@WebMvcTest(HelloRestController::class)
//@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class HelloRestControllerTest(@Autowired val mockMvc: MockMvc) {

    @Test
    internal fun `check hello`() {
        mockMvc.perform(
                MockMvcRequestBuilders.get("/api/hello")
                        .accept(MediaType.APPLICATION_JSON)
        )
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isOk)
                .andExpect(MockMvcResultMatchers.content().string("hello kotlin with spring"))

    }
}

class HelloRestControllerTest(@Autowired val mockMvc: MockMvc)這裡在 constructor 注入了 MockMvc 這個物件

當然也可以這樣寫來注入

internal class HelloRestControllerTest() {

    @Autowired lateinit var mockMvc: MockMvc

Kotlin DSL

在程式中我還提供了另一種寫法,也就是用 Kotlin DSL 來寫的語法,是不是簡潔許多呢?spring 不僅在 mockMvc 有提供 Kotlin DSL,在 router 和 spring security 也有提供 Kotlin DSL,日後會看到。

https://ithelp.ithome.com.tw/upload/images/20201008/20129902763KN9BlyR.png

那不管用哪種方式,都是可行的。

來跑看看測試結果,測試通過!

https://ithelp.ithome.com.tw/upload/images/20201008/201299029EZyAJURIq.png

以上就是第一個 Kotlin Spring Boot 的測試!

我們明天見!


上一篇
[Day 27] Kotlin Journey - Kotlin + Spring Boot
下一篇
[Day 29] Kotlin Journey - Kotlin + Spring Boot : TDD in CRUD
系列文
Kotlin 島深度之旅 30 天31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言