在单元测试时使用RealmDB时出错

时间:2017-04-08 09:00:26

标签: android junit mockito realm

我正在为ViewModel编写测试。 ViewModel中的函数是:

public void discoverMovies(boolean showLoading) {
   // reset the states to initial states
   moviesLoading.set(showLoading);
   errorViewShowing.set(false);
   emptyViewShowing.set(false);

   mMoviesRepository.getPopularMovies(1)
           .observeOn(AndroidSchedulers.mainThread())
           .subscribeOn(Schedulers.io())
           .subscribeWith(new DisposableObserver<List<Movie>>() {
               @Override
               public void onNext(List<Movie> value) {
                   // show or hide empty view
                   boolean isEmpty = value == null || value.isEmpty();

                   if (!isEmpty) {
                        saveResponse(value);
                       movies.clear();
                       movies.addAll(value);
                   }
                   emptyViewShowing.set(isEmpty);
               }

               @Override
               public void onError(Throwable throwable) {
                   errorViewShowing.set(true);
                   moviesLoading.set(false);
                   emptyViewShowing.set(false);

                   errorString.set(getErrorMessage(throwable));
               }

               @Override
               public void onComplete() {
                   moviesLoading.set(false);
                   errorViewShowing.set(false);
               }
           });
}

private void saveResponse(final MovieResponse mainResponse) {
    Realm.getDefaultInstance().executeTransaction(new Realm.Transaction() {
      @Override public void execute(Realm realm) {
        RealmMovie realmMovie = realm.createObject(RealmMovie.class);
        realmMovie.setId(1);
        realmMovie.setMarvelResponse(new Gson().toJson(mainResponse));
      }
    });
}

我在我的测试类中测试上面的函数,如下所示: 注意:一切都在没有Realm方面。我已经证实了这一点。

@Test
public void getPopularMoviesWithoutError() {
    // given the following movies
    when(mMoviesRepository.getPopularMovies(PAGE)).thenReturn(Observable.just(MOVIES));

    // discover popular movies
    mMoviesViewModel.discoverMovies(true);

    // verify that the repository is called
    verify(mMoviesRepository).getPopularMovies(PAGE);

    // test that the loading indicator is hidden
    assertFalse(mMoviesViewModel.moviesLoading.get());

    // check that the empty view is hidden
    assertFalse(mMoviesViewModel.emptyViewShowing.get());

    // check that the error view is hidden
    assertFalse(mMoviesViewModel.errorViewShowing.get());

    assertTrue(mMoviesViewModel.movies.size() == MOVIES.size());
}

它继续给我java.lang.IllegalStateException: Call Realm.init(上下文)before calling this method.如何初始化Realm 可用

1 个答案:

答案 0 :(得分:3)

我认为您收到的错误信息非常清楚导致问题的原因。你没有打电话给Realm.init

有几种方法可以做到这一点。最简单的是测试套件上的@Before@After注释。您还可以使用TestRule

不幸的是,Realm.init需要Context。要获得该上下文,您将必须处于某个环境中。这意味着您必须在设备上运行测试,如仪器测试或@David Rawson建议使用Robolectric。