📱
VolleyをCoroutineと一緒に使う
package volley
import android.content.Context
import android.util.Log
import androidx.test.core.app.ApplicationProvider
import androidx.test.filters.SmallTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.volley.Request
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import kotlinx.coroutines.runBlocking
import org.junit.Test
import org.junit.runner.RunWith
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
@RunWith(AndroidJUnit4::class)
@SmallTest
class VolleySample {
@Test
fun test() {
// Context of the app under test.
val context = ApplicationProvider.getApplicationContext<Context>()
runBlocking {
val response = getData(context)
Log.d("VolleySample", response)
}
}
private suspend fun getData(context: Context) = suspendCoroutine { cont ->
val queue = Volley.newRequestQueue(context)
val url = "https://www.google.com/"
val stringRequest = StringRequest(Request.Method.GET, url,
{ response ->
cont.resume("Response is: ${response.substring(0, 500)}")
},
{
Log.d("VolleySample", it.toString())
cont.resume("Something went wrong!")
}
)
queue.add(stringRequest)
}
}
ちょっと古めのプロジェクトで、Volleyのコールバックが大変なことになってるコードがたくさんあったので、なんとかsuspendとかCoroutineを使って綺麗にできないかと調べて見ました。
ここの記事のコードを参考にしています。
さらに上記で見つけたコードをandroidTestで動かしています。
自動テストで、実際にhttp通信すると不安定なテストになりがちですが、自分はレガシーなコードを理解する時などは最初はあえて書いてみたりします。
ciなどに組み込む場合は流石に消したり、テストの対象から外れるようにしたりします。
ざっと検索したところvolleyはjvm上だとそのまま動かなそうだったので、unittestで実行するのは挑戦してないです。
contextもRobolectricを使えばunittest上で動かせることもありますが、下記のissueのようにハマることも多いので。
※下記はKeyStoreに関するissueです。
あとRetrofitやktorはjvmでそのまま動きそうでした。ktorは試して無いです。
Retrofitをjvmで試したサンプル↓
Discussion