teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

内容を整理

2021/07/08 06:17

投稿

faaaypw
faaaypw

スコア1

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に関するコードを追加

2021/07/08 06:16

投稿

faaaypw
faaaypw

スコア1

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文字列からデータクラスを生成」以降をコメントアウトするとビルドが通りました。