📱

VolleyをCoroutineと一緒に使う

2023/11/18に公開
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を使って綺麗にできないかと調べて見ました。

ここの記事のコードを参考にしています。
https://stackoverflow.com/questions/53486087/how-can-i-use-coroutines-with-volley-so-that-my-code-can-be-written-like-sychron

さらに上記で見つけたコードをandroidTestで動かしています。
自動テストで、実際にhttp通信すると不安定なテストになりがちですが、自分はレガシーなコードを理解する時などは最初はあえて書いてみたりします。
ciなどに組み込む場合は流石に消したり、テストの対象から外れるようにしたりします。

ざっと検索したところvolleyはjvm上だとそのまま動かなそうだったので、unittestで実行するのは挑戦してないです。
contextもRobolectricを使えばunittest上で動かせることもありますが、下記のissueのようにハマることも多いので。
※下記はKeyStoreに関するissueです。

https://github.com/robolectric/robolectric/issues/1518

あとRetrofitやktorはjvmでそのまま動きそうでした。ktorは試して無いです。

Retrofitをjvmで試したサンプル↓
https://github.com/na8esin/sample-kotlin-jvm/tree/main/src/main/kotlin/retrofit2

しくみのテックブログ

Discussion