2016-12-03 153 views
0

調用的方法我創建了一個從web-service接收的一些數據,我使用retrofitrx,和我使用juintmockito來測試我的代碼的方法。我可以測試這種方法非常好,但在rxonCompleted方法,我打電話另一種方法(saveToDatabase測試一個是從RX

我怎樣才能分開這種依賴?我不想叫我在測試這個方法,請參閱下面我的代碼:

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;