본문 바로가기
안드로이드/UnitTest

안드로이드 테스트 Mock Web Server

by 김어찐 2022. 12. 13.
728x90

response josn 값을 저장할 파일을 resources 폴더를 만들고 하위에 저장(newsresponse.json)

setUp()함수에서 mockWebServer생성하고 newAPIService는 일반 apiservice와 같다

package com.ej.android_cleanarchitecture_newsapiclient.data.api

import com.google.common.truth.Truth
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.runBlocking
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import okio.buffer
import okio.source
import org.junit.After
import org.junit.Before
import org.junit.Test
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.nio.charset.Charset
import kotlin.text.Charsets.UTF_8

class NewsAPIServiceTest {
    private lateinit var service:NewsAPIService
    private lateinit var server : MockWebServer

    @Before
    fun setUp() {
        server = MockWebServer()
        service = Retrofit.Builder()
            .baseUrl(server.url(""))
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(NewsAPIService::class.java)
    }

    @After
    fun tearDown() {
        server.shutdown()
    }

    private fun enqueueMockResponse(
        fileName:String
    ){
        val inputStream = javaClass.classLoader!!.getResourceAsStream(fileName)
        val source = inputStream.source().buffer()
        val mockResponse = MockResponse()
        mockResponse.setBody(source.readString(Charsets.UTF_8))
        server.enqueue(mockResponse)
    }


    @Test
    fun getTopHeadlines_sentRequest_receivedExpected(){
        return runBlocking {
            enqueueMockResponse("newsresponse.json")
            val responseBody  = service.getTopHeadlines("us",1).body()
            val request = server.takeRequest()
            assertThat(responseBody).isNotNull()
            assertThat(request.path).isEqualTo("/v2/top-headlines?country=us&page=1&apiKey=1c779f1ab3ef48e9ac337c1a320ce614")

        }
    }

    @Test
    fun getTopHeadlines_receivedResponse_correctPageSize(){
        runBlocking {
            enqueueMockResponse("newsresponse.json")
            val responseBody  = service.getTopHeadlines("us",1).body()
            val articlesList = responseBody!!.articles
            assertThat(articlesList.size).isEqualTo(20)
        }
    }

    @Test
    fun getTopHeadlines_receivedResponse_correctContent(){
        runBlocking {
            enqueueMockResponse("newsresponse.json")
            val responseBody  = service.getTopHeadlines("us",1).body()
            val articlesList = responseBody!!.articles
            val article = articlesList[0]
            assertThat(article.author).isEqualTo("https://www.facebook.com/bbcnews")
            assertThat(article.url).isEqualTo("https://www.bbc.com/news/world-middle-east-63939428")

        }
    }
}

 

NewsAPIService

package com.ej.android_cleanarchitecture_newsapiclient.data.api

import com.ej.android_cleanarchitecture_newsapiclient.BuildConfig
import com.ej.android_cleanarchitecture_newsapiclient.data.model.APIResponse
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Query


interface NewsAPIService {

    @GET("v2/top-headlines")
    suspend fun getTopHeadlines(
        @Query("country")
        contry:String,
        @Query("page")
        page:Int,
        @Query("apiKey")
        apiKey:String = BuildConfig.API_KEY
    ): Response<APIResponse>
}
728x90

'안드로이드 > UnitTest' 카테고리의 다른 글

안드로이드 livedata 테스트  (0) 2022.12.11
안드로이드 AndroidTest (room dao test)  (0) 2022.12.11
안드로이드 UnitTest Mock  (0) 2022.12.11
안드로이드 UnitTest  (0) 2022.12.11