Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用rxjava2进行Android测试_Java_Android_Unit Testing_Rx Java - Fatal编程技术网

用rxjava2进行Android测试

用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

我正在学习写测试。 我编写了我的第一个测试,并从RXJava2+改造中得到了错误

java.lang.ExceptionInInitializeError在线
.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类在其静态初始化期间具有任何所需的环境或配置依赖项,则测试运行时不得提供这些依赖项。开始看那里。。。