Skip to content

Commit 4d1a50b

Browse files
authored
Merge pull request #61 from skydoves/inject/coroutine-scope
Add TestScope in the main rule and refactor PokedexServiceTest
2 parents 5e716f7 + f717c0d commit 4d1a50b

File tree

4 files changed

+18
-18
lines changed

4 files changed

+18
-18
lines changed

app/src/test/java/com/skydoves/pokedex/MainCoroutinesRule.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package com.skydoves.pokedex
2020

2121
import kotlinx.coroutines.Dispatchers
2222
import kotlinx.coroutines.test.TestDispatcher
23+
import kotlinx.coroutines.test.TestScope
2324
import kotlinx.coroutines.test.UnconfinedTestDispatcher
2425
import kotlinx.coroutines.test.resetMain
2526
import kotlinx.coroutines.test.setMain
@@ -30,6 +31,8 @@ class MainCoroutinesRule(
3031
val testDispatcher: TestDispatcher = UnconfinedTestDispatcher()
3132
) : TestWatcher() {
3233

34+
val testScope = TestScope(testDispatcher)
35+
3336
override fun starting(description: Description) {
3437
Dispatchers.setMain(testDispatcher)
3538
}

app/src/test/java/com/skydoves/pokedex/network/ApiAbstract.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package com.skydoves.pokedex.network
1818

1919
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
20+
import com.skydoves.pokedex.MainCoroutinesRule
2021
import com.skydoves.sandwich.adapters.ApiResponseCallAdapterFactory
22+
import kotlinx.coroutines.ExperimentalCoroutinesApi
2123
import okhttp3.mockwebserver.MockResponse
2224
import okhttp3.mockwebserver.MockWebServer
2325
import okio.buffer
@@ -29,7 +31,6 @@ import org.junit.runner.RunWith
2931
import org.junit.runners.JUnit4
3032
import retrofit2.Retrofit
3133
import retrofit2.converter.moshi.MoshiConverterFactory
32-
import java.io.IOException
3334
import java.nio.charset.StandardCharsets
3435

3536
@RunWith(JUnit4::class)
@@ -39,27 +40,27 @@ abstract class ApiAbstract<T> {
3940
@JvmField
4041
val instantExecutorRule: InstantTaskExecutorRule = InstantTaskExecutorRule()
4142

43+
@ExperimentalCoroutinesApi
44+
@get:Rule
45+
val coroutinesRule = MainCoroutinesRule()
46+
4247
lateinit var mockWebServer: MockWebServer
4348

44-
@Throws(IOException::class)
4549
@Before
4650
fun mockServer() {
4751
mockWebServer = MockWebServer()
4852
mockWebServer.start()
4953
}
5054

51-
@Throws(IOException::class)
5255
@After
5356
fun stopServer() {
5457
mockWebServer.shutdown()
5558
}
5659

57-
@Throws(IOException::class)
5860
fun enqueueResponse(fileName: String) {
5961
enqueueResponse(fileName, emptyMap())
6062
}
6163

62-
@Throws(IOException::class)
6364
private fun enqueueResponse(fileName: String, headers: Map<String, String>) {
6465
val inputStream = javaClass.classLoader!!.getResourceAsStream("api-response/$fileName")
6566
val source = inputStream.source().buffer()
@@ -74,7 +75,11 @@ abstract class ApiAbstract<T> {
7475
return Retrofit.Builder()
7576
.baseUrl(mockWebServer.url("/"))
7677
.addConverterFactory(MoshiConverterFactory.create())
77-
.addCallAdapterFactory(ApiResponseCallAdapterFactory.create())
78+
.addCallAdapterFactory(
79+
ApiResponseCallAdapterFactory.create(
80+
coroutineScope = coroutinesRule.testScope
81+
)
82+
)
7883
.build()
7984
.create(clazz)
8085
}

app/src/test/java/com/skydoves/pokedex/network/PokedexServiceTest.kt

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,12 @@
1616

1717
package com.skydoves.pokedex.network
1818

19-
import com.skydoves.pokedex.MainCoroutinesRule
2019
import com.skydoves.sandwich.ApiResponse
2120
import kotlinx.coroutines.ExperimentalCoroutinesApi
22-
import kotlinx.coroutines.runBlocking
21+
import kotlinx.coroutines.test.runTest
2322
import org.hamcrest.CoreMatchers.`is`
2423
import org.hamcrest.MatcherAssert.assertThat
2524
import org.junit.Before
26-
import org.junit.Rule
2725
import org.junit.Test
2826
import java.io.IOException
2927

@@ -32,22 +30,17 @@ class PokedexServiceTest : ApiAbstract<PokedexService>() {
3230

3331
private lateinit var service: PokedexService
3432

35-
@ExperimentalCoroutinesApi
36-
@get:Rule
37-
val coroutinesRule = MainCoroutinesRule()
38-
3933
@Before
4034
fun initService() {
4135
service = createService(PokedexService::class.java)
4236
}
4337

4438
@Throws(IOException::class)
4539
@Test
46-
fun fetchPokemonListFromNetworkTest() = runBlocking {
40+
fun fetchPokemonListFromNetworkTest() = runTest {
4741
enqueueResponse("/PokemonResponse.json")
4842
val response = service.fetchPokemonList()
4943
val responseBody = requireNotNull((response as ApiResponse.Success).data)
50-
mockWebServer.takeRequest()
5144

5245
assertThat(responseBody.count, `is`(964))
5346
assertThat(responseBody.results[0].name, `is`("bulbasaur"))
@@ -56,11 +49,10 @@ class PokedexServiceTest : ApiAbstract<PokedexService>() {
5649

5750
@Throws(IOException::class)
5851
@Test
59-
fun fetchPokemonInfoFromNetworkTest() = runBlocking {
52+
fun fetchPokemonInfoFromNetworkTest() = runTest {
6053
enqueueResponse("/Bulbasaur.json")
6154
val response = service.fetchPokemonInfo("bulbasaur")
6255
val responseBody = requireNotNull((response as ApiResponse.Success).data)
63-
mockWebServer.takeRequest()
6456

6557
assertThat(responseBody.id, `is`(1))
6658
assertThat(responseBody.name, `is`("bulbasaur"))

dependencies.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ ext.versions = [
4949
// network
5050
retrofitVersion : '2.9.0',
5151
okhttpVersion : '4.9.3',
52-
sandwichVersion : '1.2.5',
52+
sandwichVersion : '1.2.6',
5353

5454
// moshi
5555
moshiVersion : '1.13.0',

0 commit comments

Comments
 (0)