当前位置: 首页 > 知识库问答 >
问题:

Android项目中带有反应式编程的Junit

邓昊天
2023-03-14

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

我所做的是从使用改造UUID生成器调用REST API

乌伊达皮。java只是一个用于改装调用的接口(现在只是其中之一)

public interface UUIDApi {

    static final String BASE_URL = "https://www.uuidgenerator.net";

    @GET("/api/version4")
    Observable<String> getUUID();
}

UUID模型。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);
    }
}

比我有UUID观察者,这只是一个实现观察者的类。

注意:new 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);

    }

但是在observable.subscribe(testSubscriber);我得到错误'无法解决方法'订阅(io.reactivex.subscribers.TestSubscriber)'

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

共有3个答案

严宇
2023-03-14

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

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

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

>

  • 利用TestObserver(测试观察者)的handy(等待)操作符,直到TestObserver(测试观察者)接收到onError(错误)或onComplete(完成)事件。

    通过依赖项注入(例如,使用构造函数注入)提供调度程序,以便您可以在测试中用调度程序替换它们。蹦床

    使用RxJava的挂钩函数之一(例如RxJavaPlugins.setInitIoSchedulerHandler)更改您的异步调度程序的默认实现。

  • 虞承泽
    2023-03-14

    我正在测试RxJavaRetrofit这样:

    首先,我使用的是调度程序。蹦床(),用于测试。然后在基本单元测试中:

    @Mock
    ResponseBody mockResponseBody;
    
    @Test
    public void testCondition(){
        when(mService.operation()).thenReturn(Observable.just(response));
    
        mPresenter.handleOperation();
    
        verify(mView).operationResult();
    }
    

    我正在测试3个案例:成功响应(200-300),错误响应,失败

    测试成功:<代码>响应=响应。成功(你的身体)

    对于测试错误:<代码>响应=响应。错误(any\u error\u code,mockResponseBody)

    对于测试失败:只需返回可观察的。错误() 内部<代码>然后返回

    在这个单元测试中,我们嘲笑我们的webservice调用,它永远不依赖于webservice,因此即使您离线,您也可以运行单元测试。

    但是如果您想查看真正的webservice调用,您可以编写集成测试。

    陈高寒
    2023-03-14

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

    observable.test()
          .assertNoErrors()
          .assertValue(expected)
          .assertComplete();
    
     类似资料:
    • 我开始更多地接受反应式编程,并试图将其应用于我的典型业务问题。我经常使用的一种模式是数据库驱动类。我有一些已定义的单元类,如ActionProfile,其实例由ActionProfileManager管理,它从数据库表中创建实例并将其存储在映射中 然而,如果我想让它更具反应性,那么创建地图会打破单子。我可以做的一种方法是将映射本身设置为可观察的,并返回一个monad来为客户端查找特定的键。然而,中

    • 反应式编程是一种编程范式,用于处理数据流和变化的传播。 这意味着当一个组件发出数据流时,更改将通过响应式编程库传播到其他组件。 变化的传播将持续到最终接收器。 事件驱动和反应式编程之间的区别在于事件驱动的编程围绕事件而反应式编程围绕数据。 ReactiveX或RX用于反应式编程 ReactiveX或Raective Extension是最着名的反应式编程实现。 ReactiveX的工作取决于以下两

    • null 在这两种实现中,REST控制器都直接从存储库中获取数据,并将其作为列表RESP返回。作为通量。不执行进一步的应用程序逻辑。 我们对100个调用服务的用户进行了一个小型负载/性能测试,我们发现非反应实现的性能远远好于反应实现。 事实上,非反应实现不仅有更好的HTTP吞吐量,而且更有趣的是,它比反应实现消耗更少的CPU和线程!这与预期尤其相反,因为我们预期反应版本只需少量线程即可扩展,如ht

    • 我在尝试构建我的应用程序项目时遇到了巨大的麻烦。我有主应用程序模块和库项目模块,如下所示: 这是格拉德尔。为每个模块构建: 主应用程序: 这个是图书馆项目的: 最后,这是项目settings.gradle文件。 我能够成功地将包从库导入到我的应用程序代码并使用它们,但是当我尝试编译时,我会得到以下结果: 我已经试着解决这个问题三天了,几乎用尽了我在这里能找到的所有类似问题的解决方案。我对andro

    • 我想组成一个Reactor链,基本上可以做到以下几点: 验证提交的属性,例如,的长度或的有效性。我会使用下面的验证器。 验证提交的是否已被其他人使用。为此,我将使用反应性存储库。 保存,如果以上所有验证检查都通过。 用户: 反应性存储库: 验证器: 处理程序方法: 助手方法: 从被动的角度来看,我不确定如何实现这一目标。理想情况下,反应链将有3个步骤映射到上面的点。 这是我尝试过的,但我在方法参数

    • 在此输入图像描述直到最近,我一直在使用vscode,没有问题。现在没有错误出现,一些变量永远不会改变颜色。我有一个持续的错误消息:“项目......没有显式编码集”。我不知道我需要做什么。非常感谢所有的帮助!