MockWebServer - значения различаются;Ожидаемый: 1, Фактический: 0 - PullRequest
0 голосов
/ 07 февраля 2019

Ошибка Logcat:

07 февраля 2019 10:52:49 okhttp3.mockwebserver.MockWebServer $ 2 выполнить

ИНФОРМАЦИЯ: MockWebServer [54845]начало приема соединений

[size = 9333 text = [\ n {\ n "userId": 1, \ n "id": 1, \ n "title": "quidem molesti…] 07 февраля,2019 10:52:49 okhttp3.mockwebserver.MockWebServer $ 3 processOneRequest

ИНФОРМАЦИЯ: MockWebServer [54845] получил запрос: GET / album? UserId = HTTP / 1.1 и ответил: HTTP / 1.1 200 OK

07 февраля 2019 10:52:51 okhttp3.mockwebserver.MockWebServer $ 2 acceptConnections ИНФОРМАЦИЯ: MockWebServer [54845] завершил прием соединений: сокет закрыт

java.lang.AssertionError: Значения различаются;Ожидаемый: 1, фактический: 0 (защелка = 1, значения = 0, ошибки = 0, завершения = 0, время ожидания!)

в io.reactivex.observers.BaseTestConsumer.fail (BaseTestConsumer.java: 189) на io.reactivex.observers.BaseTestConsumer.assertValueCount (BaseTestConsumer.java:515) на ir.hosseinabbasi.tdd.dao.TestAlbumDaoViaMockWebService.get список альбомов с фиктивного сервера (TestAlbumDaoViaMockWebService.kt: 58)

Вывод на системную печать:

[size=9333 text=[\n  {\n    "userId": 1,\n    "id": 1,\n    "title": "quidem molesti…]

Testкласс:

@RunWith(JUnit4::class)
class TestAlbumDaoViaMockWebService {

    lateinit var albumDao: AlbumDao
    lateinit var mockWebServer: MockWebServer

    @Before
    @Throws
    fun setup() {
        mockWebServer = MockWebServer()
        mockWebServer.start()

        val okHttpClient = OkHttpClient.Builder().build()
        val retrofit = Retrofit.Builder()
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl(mockWebServer.url("/").toString())
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient)
            .build()

        albumDao = retrofit.create(AlbumDao::class.java)
    }

    @Test
    fun `get list of albums from mocked server`() {
        val testObserver = TestObserver<List<AlbumDto>>()
        val path = "/albums?userId="
        val mockResponse = MockResponse()
            .setResponseCode(200)
            .setBody(getJson("json/albums.json"))
        System.out.println(mockResponse.body.toString())

        mockWebServer.enqueue(mockResponse)
        albumDao.getAlbums("").subscribe()
        testObserver.awaitTerminalEvent(2, TimeUnit.SECONDS)

        testObserver.assertNoErrors()
        testObserver.assertValueCount(1) //Error on this line

        val request = mockWebServer.takeRequest()

        assertEquals(path, request.path)
    }

    @After
    @Throws
    fun tearDown() {
        mockWebServer.shutdown()
    }
}

album.json:

[
  {
    "userId": 1,
    "id": 1,
    "title": "quidem molestiae enim"
  },
  ...and etc...
  ,{
    "userId": 10,
    "id": 100,
    "title": "enim repellat iste"
  }
]

Метод getJson:

class Utils {
    companion object {
        fun getJson(path: String): String {
            val uri = this.javaClass.classLoader.getResource(path)
            val file = File(uri.path)
            return String(file.readBytes())
        }
    }
}

BuildConfig в моем модуле приложения:

buildConfigField("String", "BASE_URL", "\"https://jsonplaceholder.typicode.com\"")

Модификация сборки в моем модуле приложения:

class NetDao {

    fun provideRetrofit(): Retrofit =
        Retrofit.Builder()
            .baseUrl(BuildConfig.BASE_URL)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
}

Версия MockWebServer: 3.12.1

Если я прокомментирую эту строку, тест будет пройден: testObserver.assertValueCount(1)

1 Ответ

0 голосов
/ 07 февраля 2019

Я думаю, вы забыли установить

albumDao.getAlbums("").subscribe(TEST_OBSERVER_HERE)

Я создал и протестировал его.Его работа с дать наблюдателю, чтобы подписаться методом.Но если вы не даете такую ​​же ошибку, как ваша.

@RunWith(AndroidJUnit4::class)
class ApiTest {

@Test
fun jsonPlaceholderTest() {

    val mockWebServer = MockWebServer()
    mockWebServer.start()

    val okHttpClient = OkHttpClient.Builder().build()
    val retrofit = Retrofit.Builder()
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl(mockWebServer.url("/").toString())
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient)
            .build()

    val service = retrofit.create(ServiceInterface::class.java)

    mockWebServer.enqueue(
            MockResponse()
                    .setResponseCode(200)
                    .setBody("[\n" +
                            "  {\n" +
                            "    \"userId\": 1,\n" +
                            "    \"id\": 1,\n" +
                            "    \"title\": \"sunt aut facere repellat  provident occaecati excepturi optio reprehenderit\",\n" +
                            "    \"body\": \"quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto\"\n" +
                            "  },\n" +
                            "  {\n" +
                            "    \"userId\": 1,\n" +
                            "    \"id\": 2,\n" +
                            "    \"title\": \"qui est esse\",\n" +
                            "    \"body\": \"est rerum tempore vitae\\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\\nqui aperiam non debitis possimus qui neque nisi nulla\"\n" +
                            "  }\n" +
                            "]")
    )

    val testObserver = TestObserver<List<JsonPlaceHolderResponse>>()

    service.test("https://jsonplaceholder.typicode.com/posts").subscribe(testObserver)

    testObserver.awaitTerminalEvent(2, TimeUnit.SECONDS)

    testObserver.assertValueCount(1)

}
}

interface ServiceInterface {
    @GET
    fun test(@Url url : String): io.reactivex.Observable<List<JsonPlaceHolderResponse>>
}

data class JsonPlaceHolderResponse(
    var userId: Int = 0,
    var id: Int = 0,
    var title: String = "",
    var body: String = ""
)
...