Java Android项目中的Junit与反应式编程

Java Android项目中的Junit与反应式编程,java,android,rx-java,junit4,reactive-programming,Java,Android,Rx Java,Junit4,Reactive Programming,我试图在一个Android项目中使用JUnit4,在这个项目中,我还使用RxAndroid/RxJava 我所做的是使用改型调用RESTAPI UUIDApi.java只是一个用于改型调用的接口(现在只是一个) 公共接口UUIDApi{ 静态最终字符串BASE_URL=”https://www.uuidgenerator.net"; @获取(“/api/version4”) 可观察的getUUID(); } UUIDModel.java在哪里初始化改造,在哪里实现上面编写的接口 public

我试图在一个Android项目中使用JUnit4,在这个项目中,我还使用RxAndroid/RxJava

我所做的是使用改型调用RESTAPI

UUIDApi.java只是一个用于改型调用的接口(现在只是一个)

公共接口UUIDApi{
静态最终字符串BASE_URL=”https://www.uuidgenerator.net";
@获取(“/api/version4”)
可观察的getUUID();
}
UUIDModel.java在哪里初始化改造,在哪里实现上面编写的接口

public class UUIDModel implements UUIDApi{
    private Retrofit retrofit;
    private UUIDApi uuidApi;
    UUIDObserver uuidObserver = new UUIDObserver();

    public UUIDModel() {
        retrofit = new Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(new ToStringConverterFactory())
                .baseUrl(UUIDApi.BASE_URL)
                .build();
        uuidApi = retrofit.create(UUIDApi.class);
    }

    @Override
    public Observable<String> getUUID() {
        return uuidApi.getUUID();
    }

    public void generateUUID(){
        Observable<String> observable =  this.getUUID();
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(uuidObserver);
    }
}
公共类UUIDModel实现UUIDApi{
私人改装;
私人UUIDApi UUIDApi;
UUIDObserver UUIDObserver=新的UUIDObserver();
公共UUIDModel(){
改装=新改装.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(新的ToString ConverterFactory())
.baseUrl(UUIDApi.BASE\u URL)
.build();
uuidApi=reformation.create(uuidApi.class);
}
@凌驾
公共可观测getUUID(){
返回uuidApi.getUUID();
}
public void generateuid(){
Observable-Observable=this.getUUID();
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(uuidObserver);
}
}
而UUIDObserver只是一个实现了Observer的类

注意:新的ToStringConverterFactory是我发现的一个类

使用emulator执行此代码,我确信它工作正常。问题是,我不理解如何junit这段代码,因为使用rxAndroid/rxJava它会在另一个线程中执行

我读到:

测试可观察对象的官方方法是使用TestSubscriber,这是RxJava库直接提供的助手订户

所以我试过了

@Test
    public void test_uuid() throws Exception {
        UUIDApi uuidApi = new UUIDModel();
        Observable<String> observable = uuidApi.getUUID();

        TestSubscriber<String> testSubscriber = new TestSubscriber<>();
        observable.subscribe(testSubscriber);

    }
@测试
public void test_uuid()引发异常{
UUIDApi UUIDApi=新的UUIDModel();
Observable-Observable=uuidApi.getUUID();
TestSubscriber TestSubscriber=新的TestSubscriber();
可观察订阅(testSubscriber);
}
但在
observable.subscribe(testSubscriber)我收到错误“无法解析方法”订阅(io.reactivex.subscribers.TestSubscriber)


我做错了什么?我应该如何处理rxProgramming和JUnit?

我正在测试
RxJava
+
改型
如下:

首先,我使用
Schedulers.trampoline()
进行测试。 然后在基本单元测试中:

@Mock
ResponseBody mockResponseBody;

@Test
public void testCondition(){
    when(mService.operation()).thenReturn(Observable.just(response));

    mPresenter.handleOperation();

    verify(mView).operationResult();
}
我正在测试3个案例:成功响应(在200-300之间)、错误响应、失败

测试成功:
response=response.success(你的身体)

对于测试错误:
response=response.error(任何错误代码,mockResponseBody)

对于测试失败:只需返回
Observable.error()内部
然后返回

在这个单元测试中,我们模拟我们的webservice调用,它从不依赖webservice,所以即使在脱机时也可以运行单元测试


但是,如果您想看到真正的Web服务调用,您可以编写集成测试。

我正在测试
RxJava
+
改型
如下:

首先,我使用
Schedulers.trampoline()
进行测试。 然后在基本单元测试中:

@Mock
ResponseBody mockResponseBody;

@Test
public void testCondition(){
    when(mService.operation()).thenReturn(Observable.just(response));

    mPresenter.handleOperation();

    verify(mView).operationResult();
}
我正在测试3个案例:成功响应(在200-300之间)、错误响应、失败

测试成功:
response=response.success(你的身体)

对于测试错误:
response=response.error(任何错误代码,mockResponseBody)

对于测试失败:只需返回
Observable.error()内部
然后返回

在这个单元测试中,我们模拟我们的webservice调用,它从不依赖webservice,所以即使在脱机时也可以运行单元测试


但是如果你想看到真正的Web服务调用,你可以编写集成测试。

TestSubscriber
Flowable
相关,而
TestObserver
Observable
一起使用。但对于这两种情况,您实际上不必手动订阅任何内容。您只需使用
test()
方法即可

observable.test()
      .assertNoErrors()
      .assertValue(expected)
      .assertComplete();

TestSubscriber
Flowable
相关,而
TestObserver
Observable
一起使用。但对于这两种情况,您实际上不必手动订阅任何内容。您只需使用
test()
方法即可

observable.test()
      .assertNoErrors()
      .assertValue(expected)
      .assertComplete();

您可以利用
test
操作符向
TestObserver
订阅您的
Observable
,它记录事件并允许您对事件做出断言:

observable
    .test()
    .assertValue(...)
    .assertComplete()
    //etc

要处理反应流中的异步操作,您可以尝试以下方法:

  • 利用
    TestObserver
    的便捷
    wait
    操作符,等待
    TestObserver
    收到
    onError
    onComplete
    事件

  • 通过依赖项注入(例如,使用构造函数注入)提供
    调度程序
    ,这样您就可以在测试中用
    调度程序代替它们

  • 使用
    RxJava
    的钩子函数之一(例如
    RxJavaPlugins.setInitIoSchedulerHandler
    )更改异步
    调度器的默认实现


您可以利用
test
操作符向
TestObserver
订阅您的
Observable
,它记录事件并允许您对事件做出断言:

observable
    .test()
    .assertValue(...)
    .assertComplete()
    //etc

要处理反应流中的异步操作,您可以尝试以下方法:

  • 利用
    TestObserver
    的便捷
    wait
    操作符,等待
    TestObserver
    收到
    onError
    onComplete
    事件

  • 提供