2016-12-03 7 views
0

から呼び出されるメソッドは、私がretrofitrxを使用しています、と私はテストにjuintmockito私のコードを使用しています、web-serviceからいくつかのデータを受信する方法を作成しました。どのように私はこの依存関係を分離することができテストはRX

を私は非常によく、このメソッドをテストすることができますが、rxonCompleted方法では、私は別のメソッドを呼び出しています(saveToDatabase)?私は、以下の私のコードを参照してください私のテストでは、このメソッドを呼び出すにしたくない:

subscription = githubService.publicRepositories(username) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeOn(application.defaultSubscribeScheduler()) 
       .subscribe(new Subscriber<List<Repository>>() 
       { 
        @Override 
        public void onCompleted() 
        { 

         progressVisibility.set(View.INVISIBLE); 
         if (!repositories.isEmpty()) 
         { 
          recyclerViewVisibility.set(View.VISIBLE); 
         } 
         else 
         { 
          infoMessage.set(context.getString(R.string.text_empty_repos)); 
          infoMessageVisibility.set(View.VISIBLE); 
         } 

         //THIS METHOD SHOULD NOT BE CALLED IN MY TEST, I WANT TO VERIFY IT 
         saveToDatabase(MainViewModel.this.repositories); 
        } 

        @Override 
        public void onError(Throwable error) 
        { 
         Log.e(TAG, "Error loading GitHub repos ", error); 
         progressVisibility.set(View.INVISIBLE); 
         if (isHttp404(error)) 
         { 
          infoMessage.set(context.getString(R.string.error_username_not_found)); 
         } 
         else 
         { 
          infoMessage.set(context.getString(R.string.error_loading_repos)); 
         } 
         infoMessageVisibility.set(View.VISIBLE); 
        } 

        @Override 
        public void onNext(List<Repository> repositories) 
        { 
         MainViewModel.this.repositories = repositories; 
        } 
       }); 

をし、私のテストです:

String username = "usernameWithRepos"; 
     TextView textView = new TextView(application); 
     textView.setText(username); 
     List<Repository> mockRepos = MockModelFabric.newListOfRepositories(10); 
     doReturn(rx.Observable.just(mockRepos)).when(githubService).publicRepositories(username); 

     mainViewModel.onSearchAction(textView, EditorInfo.IME_ACTION_SEARCH, null); 
     verify(dataListener).onRepositoriesChanged(mockRepos); 
     assertEquals(mainViewModel.infoMessageVisibility.get(), View.INVISIBLE); 
     assertEquals(mainViewModel.progressVisibility.get(), View.INVISIBLE); 
     assertEquals(mainViewModel.recyclerViewVisibility.get(), View.VISIBLE); 

答えて

0

あなたはは、このメソッドを呼び出すないことはできませんテストで。代わりに、クラスにデータベースの依存性を追加し、それを嘲笑してください。例:

//in your class 
DataBaseClass databaseClass = new ... 
... 
dataBaseClass.save(...); 

//in your test 
@Mock DataBaseClass databaseClass;