質問編集履歴
2
内容を整理
title
CHANGED
File without changes
|
body
CHANGED
@@ -5,10 +5,8 @@
|
|
5
5
|
|
6
6
|
単体テスト作成で苦戦しているのでご助言いただきたいです。。
|
7
7
|
|
8
|
-
テスト観点としては以下を想定していますが、
|
8
|
+
テスト観点としては以下を想定していますが、そもそもビルドエラ-してしまいます。
|
9
9
|
・APIから天気情報が正常に返却された場合に呼び出しもとの情報が正常に更新される確認
|
10
|
-
・APIから例外がスロ-された場合に例外処理が正常に行われる確認
|
11
|
-
・JSON文字列のエンコード、デコードが正常に行われている確認
|
12
10
|
|
13
11
|
### 発生している問題・エラーメッセージ
|
14
12
|
|
@@ -59,7 +57,6 @@
|
|
59
57
|
```kotlin
|
60
58
|
class WeatherViewModelTest {
|
61
59
|
|
62
|
-
// java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. 対策で必要
|
63
60
|
@get:Rule
|
64
61
|
val instantTaskExecutorRule = InstantTaskExecutorRule()
|
65
62
|
|
@@ -95,27 +92,21 @@
|
|
95
92
|
|
96
93
|
****中略*****
|
97
94
|
|
98
|
-
// JSON文字列を介して天気情報を取得する関数
|
99
95
|
fun getJsonWeatherInfo() {
|
100
96
|
initializeData()
|
101
|
-
// JSON文字列を生成
|
102
97
|
val jsonAreaInfo = AreaInfo("tokyo", "2021-06-22")
|
103
|
-
// データクラスをJSON文字列化
|
104
98
|
val stringAreaInfo = Json.encodeToString(jsonAreaInfo)
|
105
99
|
try {
|
106
|
-
// returnされたJSON文字列を格納
|
107
100
|
resultJsonWeather = weatherApi.fetchJsonWeather(stringAreaInfo)
|
108
101
|
} catch (e: UnknownException) {
|
109
102
|
isGetWeather = true
|
110
103
|
}
|
111
104
|
|
112
|
-
// 取得したJSON文字列からデータクラスを生成
|
113
105
|
val resultStringWeather = resultJsonWeather?.let { Json.decodeFromString<GetAreaInfo>(it) }
|
114
106
|
currentWeather = resultStringWeather?.weather
|
115
107
|
currentMinTemp = resultStringWeather?.minTemp
|
116
108
|
currentMaxTemp = resultStringWeather?.maxTemp
|
117
109
|
|
118
|
-
// 表示する画像リソースを格納する
|
119
110
|
val weatherString = currentWeather ?: return
|
120
111
|
try {
|
121
112
|
currentWeatherImage = selectWeatherImage(weatherString)
|
@@ -126,14 +117,12 @@
|
|
126
117
|
|
127
118
|
```
|
128
119
|
```kotlin
|
129
|
-
// fetchJsonWeatherの引数となるJSON文字列を生成するクラス
|
130
120
|
@Serializable
|
131
121
|
data class AreaInfo(
|
132
122
|
val area: String,
|
133
123
|
val date: String
|
134
124
|
)
|
135
125
|
|
136
|
-
// returnされたJASON文字列をパースするクラス
|
137
126
|
@Serializable
|
138
127
|
data class GetAreaInfo(
|
139
128
|
val weather: String,
|
@@ -144,35 +133,7 @@
|
|
144
133
|
|
145
134
|
|
146
135
|
```
|
147
|
-
```kotlin
|
148
|
-
fun fetchJsonWeather(json: String): String {
|
149
|
-
// moshiは、JSON文字列をKotlin オブジェクトに変換するAndroid JSON パーサー
|
150
|
-
// moshiオブジェクトを生成
|
151
|
-
val moshi = Moshi.Builder()
|
152
|
-
.add(Date::class.java, DateAdapter())
|
153
|
-
.build()
|
154
136
|
|
155
|
-
// 変換対象のクラスを渡しアダプタを生成
|
156
|
-
val requestAdapter = moshi.adapter(Request::class.java)
|
157
|
-
// JSON文字列からオブジェクトに変換
|
158
|
-
val request = requestAdapter.fromJson(json) ?: throw IllegalArgumentException()
|
159
|
-
|
160
|
-
// 変換対象のクラスを渡しアダプタを生成
|
161
|
-
val responseAdapter = moshi.adapter(Response::class.java)
|
162
|
-
|
163
|
-
val maxTemp = (10..40).random()
|
164
|
-
val minTemp = (-40..maxTemp).random()
|
165
|
-
// JSONに変換するオブジェクトを生成
|
166
|
-
val response = Response(
|
167
|
-
weather = fetchThrowsWeather(),
|
168
|
-
maxTemp = maxTemp,
|
169
|
-
minTemp = minTemp,
|
170
|
-
date = request.date
|
171
|
-
)
|
172
|
-
// オブジェクトをJSON文字列に変換
|
173
|
-
return responseAdapter.toJson(response)
|
174
|
-
}
|
175
|
-
```
|
176
137
|
### 試したこと
|
177
138
|
JSONのデコードに関するエラーが出ているようなので、
|
178
139
|
viewMolde内のgetJsonWeatherInfo()で「// 取得したJSON文字列からデータクラスを生成」以降をコメントアウトするとビルドが通りました。
|
1
APIに関するコードを追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -144,7 +144,35 @@
|
|
144
144
|
|
145
145
|
|
146
146
|
```
|
147
|
+
```kotlin
|
148
|
+
fun fetchJsonWeather(json: String): String {
|
149
|
+
// moshiは、JSON文字列をKotlin オブジェクトに変換するAndroid JSON パーサー
|
150
|
+
// moshiオブジェクトを生成
|
151
|
+
val moshi = Moshi.Builder()
|
152
|
+
.add(Date::class.java, DateAdapter())
|
153
|
+
.build()
|
147
154
|
|
155
|
+
// 変換対象のクラスを渡しアダプタを生成
|
156
|
+
val requestAdapter = moshi.adapter(Request::class.java)
|
157
|
+
// JSON文字列からオブジェクトに変換
|
158
|
+
val request = requestAdapter.fromJson(json) ?: throw IllegalArgumentException()
|
159
|
+
|
160
|
+
// 変換対象のクラスを渡しアダプタを生成
|
161
|
+
val responseAdapter = moshi.adapter(Response::class.java)
|
162
|
+
|
163
|
+
val maxTemp = (10..40).random()
|
164
|
+
val minTemp = (-40..maxTemp).random()
|
165
|
+
// JSONに変換するオブジェクトを生成
|
166
|
+
val response = Response(
|
167
|
+
weather = fetchThrowsWeather(),
|
168
|
+
maxTemp = maxTemp,
|
169
|
+
minTemp = minTemp,
|
170
|
+
date = request.date
|
171
|
+
)
|
172
|
+
// オブジェクトをJSON文字列に変換
|
173
|
+
return responseAdapter.toJson(response)
|
174
|
+
}
|
175
|
+
```
|
148
176
|
### 試したこと
|
149
177
|
JSONのデコードに関するエラーが出ているようなので、
|
150
178
|
viewMolde内のgetJsonWeatherInfo()で「// 取得したJSON文字列からデータクラスを生成」以降をコメントアウトするとビルドが通りました。
|