котлин + дооснащение + сопрограмма + androidTest - PullRequest
1 голос
/ 08 июня 2019

Как создать androidTest для образца retrofit запроса?

Sample

data class TestDataClass(
    val id: String,
    val employee_name: String,
    val employee_salary: String,
    val employee_age: String,
    val profile_image: String)

enum class NetworkState { LOADING, ERROR, DONE }

private const val BASE_URL = "http://dummy.restapiexample.com/api/v1/"

private val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()



private val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .addCallAdapterFactory(CoroutineCallAdapterFactory())
    .baseUrl(BASE_URL)
    .build()

interface TestApiService {
    @GET("employees")
    fun getPropertiesAsync():
            Deferred<List<TestDataClass>>
}

object TestApi {
    val retrofitTest : TestApiService by lazy { retrofit.create(TestApiService::class.java) }
}

1 Ответ

1 голос
/ 08 июня 2019

Вы можете использовать библиотеку MockWebServer от Square.

Создать resources в исходном наборе тестов (src / test / resources) и вставить в него файл JSON, содержащийпример ответа от вашего API.Допустим, это выглядит так:

src / test / resources / sample_response.json

[
  {
    "id": "1",
    "employee_name": "John Doe",
    "employee_salary": "60000",
    "employee_age": 37,
    "profile_image": "https://dummy.sample-image.com/johndoe"
  }
]

Затем вы можете написать свои тесты как:


class ApiTest {

  private lateinit var server: MockWebServer
  private lateinit var retrofit: Retrofit
  private lateinit var service: TestApiService

  @Before
  fun setup() {
    server = MockWebServer()
    retrofit = Retrofit.Builder()
        .addConverterFactory(MoshiConverterFactory.create(get<Moshi>()))
        .addCallAdapterFactory(get<CoroutinesNetworkResponseAdapterFactory>())
        .baseUrl(mockWebServer.url("/"))
        .build()
    service = retrofit.create(TestApi::class.java)
  }

  @After
  fun teardown() {
    server.close()
  }

  @Test
  fun simpleTest() = runBlocking<Unit> {
    val sampleResponse = this::class.java.getResource("/sample_response.json").readText()

    server.enqueue(
      MockResponse()
        .setBody(sampleResponse)
    )

    val response = service.getPropertiesAsync().await()

    assertTrue(1, response.size)
    assertTrue(response[0].employee_name = "John Doe"
    // Make as many assertions as you like
  }

}

Вы должны спросить себя, что именно вы пытаетесь проверить?Нет необходимости тестировать функциональность Retrofit.Вам также не следует проверять функциональность других известных библиотек, таких как Moshi.

Эти тесты лучше всего служат для проверки правильности моделей данных, созданных вами для ответов API, и правильности вашего синтаксического анализатора (в данном случае,Moshi) может корректно обрабатывать неожиданные значения (например, ноль).Поэтому важно, чтобы выбранные вами примеры ответов были фактическими ответами вашего API, чтобы ваши модели данных могли быть проверены на соответствие реальным данным в тестах перед их использованием в приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...