MockWebServer - 值计数不同;预期:1,实际:0
MockWebServer - Value counts differ; Expected: 1, Actual: 0
Logcat 错误:
Feb 07, 2019 10:52:49 AM okhttp3.mockwebserver.MockWebServer execute
INFO: MockWebServer[54845] starting to accept connections
[size=9333 text=[\n {\n "userId": 1,\n "id": 1,\n "title": "quidem molesti…]
Feb 07, 2019 10:52:49 AM okhttp3.mockwebserver.MockWebServer processOneRequest
INFO: MockWebServer[54845] received request: GET /albums?userId= HTTP/1.1 and responded: HTTP/1.1 200 OK
Feb 07, 2019 10:52:51 AM okhttp3.mockwebserver.MockWebServer acceptConnections
INFO: MockWebServer[54845] done accepting connections: Socket closed
java.lang.AssertionError: Value counts differ; Expected: 1, Actual: 0 (latch = 1, values = 0, errors = 0, completions = 0, timeout!)
at io.reactivex.observers.BaseTestConsumer.fail(BaseTestConsumer.java:189)
at io.reactivex.observers.BaseTestConsumer.assertValueCount(BaseTestConsumer.java:515)
at ir.hosseinabbasi.tdd.dao.TestAlbumDaoViaMockWebService.get list of albums from mocked server(TestAlbumDaoViaMockWebService.kt:58)
系统打印输出:
[size=9333 text=[\n {\n "userId": 1,\n "id": 1,\n "title": "quidem molesti…]
测试class:
@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()
}
}
albums.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())
}
}
}
我的 App 模块中的 BuildConfig:
buildConfigField("String", "BASE_URL", "\"https://jsonplaceholder.typicode.com\"")
在我的 App 模块中构建 Retrofit:
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)
我想你忘了设置
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 = ""
)
Logcat 错误:
Feb 07, 2019 10:52:49 AM okhttp3.mockwebserver.MockWebServer execute
INFO: MockWebServer[54845] starting to accept connections
[size=9333 text=[\n {\n "userId": 1,\n "id": 1,\n "title": "quidem molesti…] Feb 07, 2019 10:52:49 AM okhttp3.mockwebserver.MockWebServer processOneRequest
INFO: MockWebServer[54845] received request: GET /albums?userId= HTTP/1.1 and responded: HTTP/1.1 200 OK
Feb 07, 2019 10:52:51 AM okhttp3.mockwebserver.MockWebServer acceptConnections INFO: MockWebServer[54845] done accepting connections: Socket closed
java.lang.AssertionError: Value counts differ; Expected: 1, Actual: 0 (latch = 1, values = 0, errors = 0, completions = 0, timeout!)
at io.reactivex.observers.BaseTestConsumer.fail(BaseTestConsumer.java:189) at io.reactivex.observers.BaseTestConsumer.assertValueCount(BaseTestConsumer.java:515) at ir.hosseinabbasi.tdd.dao.TestAlbumDaoViaMockWebService.get list of albums from mocked server(TestAlbumDaoViaMockWebService.kt:58)
系统打印输出:
[size=9333 text=[\n {\n "userId": 1,\n "id": 1,\n "title": "quidem molesti…]
测试class:
@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()
}
}
albums.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())
}
}
}
我的 App 模块中的 BuildConfig:
buildConfigField("String", "BASE_URL", "\"https://jsonplaceholder.typicode.com\"")
在我的 App 模块中构建 Retrofit:
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)
我想你忘了设置
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 = ""
)