【问题标题】:Test a method that is called from rx测试从 rx 调用的方法
【发布时间】:2017-04-18 04:32:21
【问题描述】:

我创建了一个从web-service 接收一些数据的方法,我正在使用retrofitrx,并且我正在使用juintmockito 来测试我的代码。我可以很好地测试这个方法,但是在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);

【问题讨论】:

    标签: android mvvm mockito retrofit rx-java


    【解决方案1】:

    不能在测试中不调用此方法。相反,添加到您的类 数据库依赖项 并模拟它。例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多