Java Android项目中的Junit与反应式编程
我试图在一个Android项目中使用JUnit4,在这个项目中,我还使用RxAndroid/RxJava 我所做的是使用改型调用RESTAPI UUIDApi.java只是一个用于改型调用的接口(现在只是一个)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
公共接口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
事件
- 提供