2021 iThome 鐵人賽 Day 11:Data layer testing (2)
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 11 篇,你可到 iThome 查看原文。 文章目錄 今天會繼續寫 EtaResponseMapperTest。我們示範的 test case 是正常輸出班次的情景。首先是準備 response: ...
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 11 篇,你可到 iThome 查看原文。 文章目錄 今天會繼續寫 EtaResponseMapperTest。我們示範的 test case 是正常輸出班次的情景。首先是準備 response: ...
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 10 篇,你可到 iThome 查看原文。 文章目錄 在切回去寫 domain layer 之前,我們先把之前寫好的 data layer class 補回 unit test。在開始寫之前,我們要先加入一些 testing 會用到的 dependency(Strikt 和 MockK): ...
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 9 篇,你可到 iThome 查看原文。 文章目錄 上一篇在實作 EtaResponseMapper 的時候我們用了 Java 8 開始有的 Instant、LocalDateTime 和 ZonedDateTime。它們都是跟日期時間相關的 class。但其實 Kotlin 都有 kotlinx-datetime 做類似的東西。但目前 kotlinx-datetime 還是在早期開發階段,有很多常用功能都未做到,例如我們這次需要用到的 formatter 目前仍需要用 Java time,所以還是用 Java time 算。 ...
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 8 篇,你可到 iThome 查看原文。 文章目錄 上一篇的 repository 還欠一個 mapper 把 EtaResponse 轉成 EtaResult。我們首先準備一個通用的 interface: interface Mapper<T, R> { suspend fun map(o: T): R } 有些 Android Clean Architecture 會每個 layer 都準備一個對應的 mapper interface,這次示範我們就簡化這一部分,全部 layer 都共用同一個 mapper interface,不論是由高層次 layer 去低層次 layer 還是由低層次 layer 去高層次 layer 都一樣。因為這個 mapper 都是為了在寫 unit test 時可以 mock 那個 interface 而不是 mock 那個 concrete implementation,所以它是不是共用 interface 問題不大。 ...
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 7 篇,你可到 iThome 查看原文。 文章目錄 在上一篇,我們把 Ktor client 加到 Dagger 的 object graph 內。現在我們就繼續寫 data layer 部分。 跨 layer 共用部分 不過在繼續之前,我們要先準備一些通用的 enum。這些 enum 分別是用來表示路綫、車站和語言。因為這次的示範 app 所用到的車站和路綫的數量有限,我們就簡化用 enum 寫死在 app 入面就算了,但如果數量多的話或許會改用 SQLite database 之類去儲存它們。在這種情況下,我們一般都會每個 layer 都有對應的 data class 表示,而不會好像現在把 data class/enum 放在 common 的地方。 ...
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 6 篇,你可到 iThome 查看原文。 文章目錄 在 Android 開發如果要用到 HTTP client 的話基本上大家都預設用 OkHttp + Retrofit 這個組合。這次我們試試一些新東西:Ktor。 ...
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 5 篇,你可到 iThome 查看原文。 文章目錄 談到 Android 的 dependency injection (DI),大家一定會想到 Dagger 這個 DI library。因為 Dagger 2 是由 Google 開發,加上在 Android Developers 網站有對應的教學文章,所以成為不二之選。不過 Dagger 向來都有難學的印象,尤其是在以前 Dagger 2 網站那個惡名昭彰的咖啡機教學。本來用咖啡機來說明 DI 的概念就沒有甚麼大問題,問題在於看完那個咖啡機類比是不會知道如何在 Android app 上套用那些概念和 Dagger 提供的功能。或許大家讀電腦科學/計算機科學/資訊工程之類的課程時都有學過 DI 但還是不能順利地用 Dagger,這是因為 Android 那些組件的 constructor 不是由我們去 call,結果要在 onCreate 之類的 callback 加上 DI library 要我們寫的 code 才能拿到我們要用的 dependency。 ...
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 4 篇,你可到 iThome 查看原文。 文章目錄 JSON serialization/deserialization 應該是不少 Android app 都會做的事,基本上近乎每個 Android project 都會用了一個或幾個這些 library,而 Android 都有好幾個選擇。除了上一篇提過的 org.json 套件之外,Gson、Moshi 和 Kotlin serialization 都是熱門的選擇。 ...
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 3 篇,你可到 iThome 查看原文。 文章目錄 我們用到的 API endpoint 只有一個,就是用來取得港鐵機場快綫、東涌綫、屯馬綫及將軍澳綫最多四班即將到站列車的抵達時間。車站清單我們會直接寫死在 app 裏面。API 的使用方法可以在資料一線通網站(香港政府 open data 的網站)內找到。這個 API 是不需要額外申請 API key,只是一個普通的 HTTP GET request,然後 response body 是一個 JSON object。 ...
本篇文章是 2021 iThome 鐵人賽參賽題目「寫一個列車抵站時間 Android App」的第 2 篇,你可到 iThome 查看原文。 文章目錄 Architecture Components 以前 Android Developers 網站沒有特別提及過寫 Android app 應該用甚麼 architecture,直至到近年 Google 因應社群的要求才建議使用 MVVM並推出了對應 MVVM 的 Architecture Components library。下圖是 Android Developers 網站建議的 architecture: ...