我正在开发一个使用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()
}
}但是,当我取消assertCompleted在TestSubscriber上的评论时,我总是得到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: []发布于 2016-12-29 00:17:57
这里发生了几件事。首先,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!"));您需要构建您的响应以反映预期的响应。
有关更多示例,请参见自述文件。
https://stackoverflow.com/questions/41366005
复制相似问题