2016-12-28 2 views
2

Я разрабатываю приложение с использованием архитектуры MVP. Я пытаюсь проверить Interactors моего приложения с помощью MockWebServer. Ну, у меня есть этот тест:Как сделать работу 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() 
    } 
} 

И моя база URL (Там нет сервера бэкенд ... может быть что угодно):

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

Итак, что мне не хватает? Этот код должен работать ...

Любая помощь приветствуется!

EDIT:

Итак, я изменил код для этого:

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: [] 

ответ

2

Здесь есть несколько вещей. Во-первых, MockWebServer.url() решает данный URL-адрес для базового url макет-сервера, он не устанавливает URL-адрес. Если вы хотите установить URL-адрес, вам необходимо передать его методу start(). Как правило, настроить переоснащения назвать конечную точку сервера -

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

Во-вторых, чтобы получить ответы от макетом веб-сервер, вам необходимо епдиеие ожидаемые ответы, MockResponse с. В противном случае он не знает, что отправить назад. Перед тем, как сделать запрос, сделайте следующее:

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

Вам нужно будет построить свой ответ, чтобы отразить ожидаемый ответ.

Дополнительную информацию см. На сайте README.

+0

Спасибо за ответ iagreen. Я попробую это. –

+0

Я сделал точно так, как вы писали, но все равно не повезло. –

Смежные вопросы