用rxjava2进行Android测试
我正在学习写测试。 我编写了我的第一个测试,并从RXJava2+改造中得到了错误 java.lang.ExceptionInInitializeError在线用rxjava2进行Android测试,java,android,unit-testing,rx-java,Java,Android,Unit Testing,Rx Java,我正在学习写测试。 我编写了我的第一个测试,并从RXJava2+改造中得到了错误 java.lang.ExceptionInInitializeError在线.subscribeOn(Schedulers.io()) 代码: 我的测试: public class SearchPresenterTest { @Rule public TestComponentRule testComponentRule = new TestComponentRule(); SearchP
.subscribeOn(Schedulers.io())
代码:
我的测试:
public class SearchPresenterTest {
@Rule
public TestComponentRule testComponentRule = new TestComponentRule();
SearchPresenter searchPresenter;
@Mock ISearchView$$State searchView$$State;
@Mock DataManager dataManager;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
RxJavaPlugins.reset();
RxJavaPlugins.setInitIoSchedulerHandler(schedulerCallable -> Schedulers.trampoline());
RxAndroidPlugins.reset();
RxAndroidPlugins.setInitMainThreadSchedulerHandler(schedulerCallable -> Schedulers.trampoline());
RxJavaPlugins.setIoSchedulerHandler(scheduler -> Schedulers.trampoline());
RxAndroidPlugins.setMainThreadSchedulerHandler(schedulerCallable -> Schedulers.trampoline());
searchPresenter = new SearchPresenter();
searchPresenter.setViewState(searchView$$State);
}
@Test
public void searchTest() {
MovieList movieList = new MovieList();
Response response = Response.success(new MovieList());
Observable<Response<MovieList>> obs = Observable.just(response);
when(dataManager.searchMovies(anyString())).thenReturn(obs);
searchPresenter.search(searchRequest());
verify(searchView$$State).showProgress();
verify(searchView$$State).hideProgress();
verify(searchView$$State).showSearchResults(movieList);
}
private String searchRequest() {
return "pirates";
}
}
公共类SearchPresenterTest{
@统治
公共TestComponentRule TestComponentRule=新TestComponentRule();
搜索演示者搜索演示者;
@模拟ISearchView$$State searchView$$State;
@模拟数据管理器数据管理器;
@以前
公共void init(){
initMocks(this);
RxJavaPlugins.reset();
setInitIoSchedulerHandler(schedulerCallable->Schedulers.trampoline());
RxAndroidPlugins.reset();
setInitMainThreadSchedulerHandler(schedulerCallable->Schedulers.trampoline());
setIoSchedulerHandler(调度器->调度器.trampoline());
setMainThreadSchedulerHandler(schedulerCallable->Schedulers.trampoline());
searchPresenter=新的searchPresenter();
searchPresenter.setViewState(searchView$$State);
}
@试验
公共无效搜索测试(){
MovieList MovieList=新的MovieList();
Response=Response.success(newmovielist());
可观察的obs=可观察的公正(响应);
when(dataManager.searchMovies(anyString())。然后返回(obs);
searchPresenter.search(searchRequest());
验证(searchView$$State).showProgress();
验证(searchView$$State).hideProgress();
验证(searchView$$State)。显示搜索结果(movieList);
}
私有字符串searchRequest(){
归还“海盗”;
}
}
我试图用RxJavaPlugins.setIoSchedulerHandler()和@Before中的其他方法修复它,但没有任何帮助。这解决了我的问题:
@BeforeClass
public static void setUpRxSchedulers() {
Scheduler immediate = new Scheduler() {
@Override
public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
// this prevents StackOverflowErrors when scheduling with a delay
return super.scheduleDirect(run, 0, unit);
}
@Override
public Worker createWorker() {
return new ExecutorScheduler.ExecutorWorker(Runnable::run);
}
};
RxJavaPlugins.setInitIoSchedulerHandler(scheduler -> immediate);
RxJavaPlugins.setInitComputationSchedulerHandler(scheduler -> immediate);
RxJavaPlugins.setInitNewThreadSchedulerHandler(scheduler -> immediate);
RxJavaPlugins.setInitSingleSchedulerHandler(scheduler -> immediate);
RxAndroidPlugins.setInitMainThreadSchedulerHandler(scheduler -> immediate);
}
这解决了我的问题:
@BeforeClass
public static void setUpRxSchedulers() {
Scheduler immediate = new Scheduler() {
@Override
public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
// this prevents StackOverflowErrors when scheduling with a delay
return super.scheduleDirect(run, 0, unit);
}
@Override
public Worker createWorker() {
return new ExecutorScheduler.ExecutorWorker(Runnable::run);
}
};
RxJavaPlugins.setInitIoSchedulerHandler(scheduler -> immediate);
RxJavaPlugins.setInitComputationSchedulerHandler(scheduler -> immediate);
RxJavaPlugins.setInitNewThreadSchedulerHandler(scheduler -> immediate);
RxJavaPlugins.setInitSingleSchedulerHandler(scheduler -> immediate);
RxAndroidPlugins.setInitMainThreadSchedulerHandler(scheduler -> immediate);
}
ExceptionInInitializerError表示静态初始化代码正在引发异常。类中的静态初始化代码在JVM加载该类时运行,因此Schedulers类似乎包含一个失败的静态初始化代码块。或者它可以是Schedulers.io()调用中引用的类(包含静态初始化)。如果Schedulers类在其静态初始化期间具有任何所需的环境或配置依赖项,则测试运行时不得提供这些依赖项。从这里开始查看…ExceptionInInitializerError表示静态初始化代码正在引发异常。类中的静态初始化代码在JVM加载该类时运行,因此Schedulers类似乎包含一个失败的静态初始化代码块。或者它可以是Schedulers.io()调用中引用的类(包含静态初始化)。如果Schedulers类在其静态初始化期间具有任何所需的环境或配置依赖项,则测试运行时不得提供这些依赖项。开始看那里。。。