iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 6
0
自我挑戰組

30 天開發 Android App 的流水帳系列 第 6

Day 6:星戰人物 response 分析及單元測試撰寫(3/3)

回顧前兩天做了什麼,分析了 response 欄位然後在設計物件的時候,需要考慮什麼,並針對這個物件寫了一個 unit test。

在這個 part 還有什麼要做的呢?我自己的習慣把物件建好之後,先從最下面的實做開始,一路往上,最後再嫁接網路層。在寫完單元測試之後,在 IDE 執行驗證,不需要再花時間 build 在手機上,讓後面嫁接網路層不用花太多時間一一追蹤到底哪裡有問題。

昨天我們是直接把 json 的格式直接塞在變數當中,然後再用 gons 的方式做解析。如果 api 的資料變多了該怎麼辦?總不能一直複製貼上,然後有些時候想要改值,還要很這麼長的 response 中找到自己想要改的欄位。我最熟悉的是 json 格式,那麼我把這些資料存著,讓 unit test 可以隨時可以去讀它,而想要什麼樣的測資也可以自己產生

首先把 profileList.json 的資料存在 /src/main/assets 之下
https://ithelp.ithome.com.tw/upload/images/20200918/20130546Iruw6w9g09.png

接下來,怎麼讓 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 的處理就到今天結束,明天開始分享怎麼建立網路層。


上一篇
Day 5:星戰人物 response 分析及單元測試撰寫(2/3)
下一篇
Day 7:藉由 Retrofit 嫁接星戰 API(1/2)
系列文
30 天開發 Android App 的流水帳32

尚未有邦友留言

立即登入留言