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



我正在为 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));
      }
    });
}

我在我的测试类中测试上面的函数,如下所示:注意:一切都可以在没有领域方面的情况下工作。我已经确认了。

@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(Context( before calling this method. 如何初始化 Realm待提供

我认为您收到的错误消息非常清楚导致问题的原因。 你不是在打电话Realm.init.

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

不幸的是,Realm.init需要Context。 要获得该上下文,您必须处于具有上下文的环境中。 这意味着您要么必须在设备上运行测试,如检测测试,要么如 Rawson @David建议的那样,使用 Robolectric。

相关内容

  • 没有找到相关文章

最新更新