2016-12-03 1 views
0

에서 호출하는 방법은 내가 retrofit, rx를 사용하고, 나는 시험에 juintmockito 내 코드를 사용하고, web-service에서 일부 데이터를 수신하는 방법을 만들었습니다. 나는 아주 잘이 방법을 테스트 할 수 있지만 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;