如何使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> 

我的NetModule:

 @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() } } 

和我的基地址(没有后端服务器…可以是任何东西):

 <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!")); 

您需要构建您的响应以反映预期的响应。

有关更多示例,请参见自述文件 。