回顧前兩天做了什麼,分析了 response 欄位然後在設計物件的時候,需要考慮什麼,並針對這個物件寫了一個 unit test。
在這個 part 還有什麼要做的呢?我自己的習慣把物件建好之後,先從最下面的實做開始,一路往上,最後再嫁接網路層。在寫完單元測試之後,在 IDE 執行驗證,不需要再花時間 build 在手機上,讓後面嫁接網路層不用花太多時間一一追蹤到底哪裡有問題。
昨天我們是直接把 json 的格式直接塞在變數當中,然後再用 gons 的方式做解析。如果 api 的資料變多了該怎麼辦?總不能一直複製貼上,然後有些時候想要改值,還要很這麼長的 response 中找到自己想要改的欄位。我最熟悉的是 json 格式,那麼我把這些資料存著,讓 unit test 可以隨時可以去讀它,而想要什麼樣的測資也可以自己產生
首先把 profileList.json 的資料存在 /src/main/assets
之下
接下來,怎麼讓 unit test 的 class 讀 json 呢?而且每一個 test 需要對應不同的測資,那就來建立一個 base 的 test 讓以後讀取這段共用的函式:
private const val ASSET_BASE_PATH = "../app/src/main/assets/"
open class BaseTest {
fun readJsonFile(jsonFileName: String): String {
if (jsonFileName.endsWith("json")) {
throw Exception("Do not put the json file extension")
}
val bufferedReader = BufferedReader(
InputStreamReader(
FileInputStream("${ASSET_BASE_PATH}$jsonFileName.json")
)
)
val stringBuilder = StringBuilder()
var line = bufferedReader.readLine()
while (line != null) {
stringBuilder.append(line)
line = bufferedReader.readLine()
}
return stringBuilder.toString()
}
}
回到 ProfileListTest
,繼承這個 BaseTest
,然後讀取剛剛建立的 profileList.json
class ProfileListTest : BaseTest() {
@Test
fun listTest(){
val list = getList()
list.results.forEach {
println(it)
}
}
private fun getList(): ProfileList {
val jsonRawData = readJsonFile("profileList")
return Gson().fromJson(
jsonRawData,
ProfileList::class.java
)
}
}
接著就可以看到印出的結果如下:
Profile(name=Luke Skywalker, height=172, weight=77, gender=male, birthYear=19BBY)
Profile(name=C-3PO, height=167, weight=75, gender=n/a, birthYear=112BBY)
Profile(name=R2-D2, height=96, weight=32, gender=n/a, birthYear=33BBY)
Profile(name=Darth Vader, height=202, weight=136, gender=male, birthYear=41.9BBY)
Profile(name=Leia Organa, height=150, weight=49, gender=female, birthYear=19BBY)
Profile(name=Owen Lars, height=178, weight=120, gender=male, birthYear=52BBY)
Profile(name=Beru Whitesun lars, height=165, weight=75, gender=female, birthYear=47BBY)
Profile(name=R5-D4, height=97, weight=32, gender=n/a, birthYear=unknown)
Profile(name=Biggs Darklighter, height=183, weight=84, gender=male, birthYear=24BBY)
Profile(name=Obi-Wan Kenobi, height=182, weight=77, gender=male, birthYear=57BBY)
results 欄位的資料全部都解出來了,那麼要後怎麼驗證各 Profile 的資料正確性,請大家去 gihub 上看,就不放在這邊的內容多加說明了。
response 的處理就到今天結束,明天開始分享怎麼建立網路層。