Вы можете добиться этого с помощью MockWebServer
class MovieApiTest {
private var mockWebServer = MockWebServer()
private lateinit var apiService: MovieApiService
@Before
fun setUp() {
// checkthis blogpost for more details about mock server
// https://medium.com/@hanru.yeh/unit-test-retrofit-and-mockwebserver-a3e4e81fd2a2
mockWebServer.start()
apiService = Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.baseUrl(mockWebServer.url("/")) // note the URL is different from production one
.build()
.create(MovieApiService::class.java)
}
@After
fun teardown() {
mockWebServer.shutdown()
}
@Test
fun testCompleteIntegration() = runBlocking { // that will allow to wait for coroutine
mockWebServer.enqueue(MockResponse()
.setResponseCode(HttpURLConnection.HTTP_OK)
.setBody("""{
"page":0,
"total_results":1,
"total_pages":1,
"results": [{"id": "movie_id"}]
}"""))
val response = apiService.getMoviesAsync(page = 1).await()
assertEquals(0, response.page)
assertEquals(1, response.total_results)
assertEquals(1, response.total_pages)
assertEquals("movie_id", response.results.first().id)
}
}
Таким образом вы можете избежать вызова реального сервера, который не будет хорошо работать в модульных тестах из-за задержки и недетерминированности c состояние сети.
Кроме того, я рекомендую разбивать код на части, чтобы вы могли тестировать их независимо, если у вас сложная логика синтаксического анализа. c: сделайте поля необязательными и определите отдельный модуль отображения, который может проверять, какие части из JSON являются обязательными, и которые являются обязательными, и протестируйте этот сопоставитель отдельно.