android - 如何让 MockWebServer 工作?

标签 android retrofit kotlin mockwebserver

我正在使用 MVP 架构开发应用程序。我正在尝试使用 MockWebServer 测试我的应用程序的交互器。好吧,我有这个测试:

@RunWith(RobolectricTestRunner::class)
@Config(constants = BuildConfig::class, manifest = "src/main/AndroidManifest.xml", packageName = "br.com.simplepass.simplepassnew", sdk = intArrayOf(23))
class LoginInteractorImplTest {

    lateinit var mLoginInteractor : LoginInteractor
    lateinit var mServer: MockWebServer


    @Before
    fun setUp(){
        mLoginInteractor = LoginInteractorImpl()
        mServer = MockWebServer()
        mServer.start()
    }

    @Test
    fun loginTest(){
        mServer.url("http://192.168.0.10:8080/login")

        val testSubscriber = TestSubscriber.create<User>()

        mLoginInteractor.login("31991889992", "lala").subscribe(testSubscriber)
        testSubscriber.assertNoErrors()
//        testSubscriber.assertCompleted()
    }

    @After
    fun tearDown(){
        mServer.shutdown()
    }
}

但是,当我取消对 TestSubscriber 上的 assertCompleted 的注释时,我总是得到 assertionError... 我知道 TestSubscriber 有效,因为我在其他测试中使用它。

这是我的 ApiCall:

@GET("login")
fun login() : Observable<User>

我的网络模块:

@Module
class NetModule(val mBaseUrl: String) {

    @Provides
    @Singleton
    fun provideHttpCache(application: Application): Cache {
        val cacheSize = 10 * 1024 * 1024
        return Cache(application.cacheDir, cacheSize.toLong())

    }

    @Provides
    @Singleton
    fun provideOkhttpClient(cache: Cache) : OkHttpClient {
        val client = OkHttpClient.Builder()

        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY

        client.addInterceptor(interceptor)
        return client.cache(cache).build()
    }

    @Provides
    @Singleton
    fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
        return Retrofit.Builder()


          .baseUrl(mBaseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .client(okHttpClient)
            .build()
    }
}

还有我的基本 URL(没有后端服务器......可以是任何东西):

<string name="api_base_url">http://192.168.0.12:8080</string>

那么,我错过了什么?这段代码应该可以工作...

欢迎任何帮助!

编辑:

因此,我将代码更改为:

mLoginInteractor = LoginInteractorImpl()
        mServer = MockWebServer()

        mServer.enqueue(MockResponse()
                .setResponseCode(200)
                .setBody(Gson().toJson(User(1, "991889992", "Leandro", "123"))))

        mServer.start()

        val client = OkHttpClient.Builder()
        val cacheSize = 10 * 1024 * 1024

        client.cache(Cache(application.cacheDir, cacheSize.toLong())).build()

        mLoginInteractor.setRetrofit(Retrofit.Builder()
                .baseUrl(mServer.url("/"))
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client.cache(Cache(application.cacheDir, cacheSize.toLong())).build())
                .build())

还有这个:

val testSubscriber = TestSubscriber.create<User>()

        mLoginInteractor.login("31991889992", "lala").subscribe(testSubscriber)
        testSubscriber.assertNoErrors()
        testSubscriber.assertReceivedOnNext(listOf(User(1, "991889992", "Leandro", "123")))
        testSubscriber.assertCompleted()

但我仍然得到这个错误:

Number of items does not match. Provided: 1  Actual: 0.
Provided values: [User(id=1, phoneNumber=991889992, name=Leandro, password=123)]
Actual values: []

最佳答案

这里发生了几件事。首先,MockWebServer.url() 根据模拟服务器的基本 url 解析给定的 url,它不设置 url。如果要设置 url,则需要将其传递给 start() 方法。通常,您将改造配置为调用服务器的端点——

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(server.url("/"))
    // Other builder methods.
    .build();

其次,要从模拟 Web 服务器获得响应,您需要将预期响应作为 MockResponse 加入队列。秒。否则它不知道要发回什么。在提出请求之前,请执行以下操作——

server.enqueue(new MockResponse().setBody("Success!"));

您需要构建您的响应以反射(reflect)预期的响应。

参见 README更多示例。

关于android - 如何让 MockWebServer 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41366005/

相关文章:

android - 如何编写模拟 GPS 位置的 Espresso 测试并在 Google TeSTLab 中使用它们?

android - 使用 Retrofit、Moshi 和 Kotlin 解开封装的响应

kotlin - Unresolved reference : Callback

java - 在Android Kotlin上使用 Canvas mask 输入的文本

java.lang.RuntimeException : Unable to instantiate Android stub 错误

android - 如何在android中创建可绘制的环形?

java - 通过 Android PDFDocument 生成的 PDF 尺寸太大。在使用 pdfbox 时,它会在输出中剪切图像

android - 如何为 Retrofit 配置调试和发布日志级别?

php - 使用 Android 应用程序使用 URL 在服务器上保存图像 ERROR 输入错误结束在第 1 行第 1 列路径 $

spring-boot - 在 Spring Boot 中公开的 SQL 日志记录