android - 单元测试 : How to verify and mock onCompleted for an Observable in RxJava within Android

标签 android unit-testing mockito rx-java

我正在尝试为使用 Retrofit 2、Mockito 1.10 和 RXJava 1.0 的 Android 应用程序编写一些单元测试。我没有使用支持 lambda 的 java 版本!

我的代码使用 Observables,我可以执行以下操作:

when(myAPI.Complete(anyString(), any(MyContainer.class)))
        .thenReturn(Observable.<GenericResponse>error(new Throwable("An error has occurred!")));

Subscriber genericResponseSubscriber = mock(Subscriber.class);

myPresenter.myUseCase(id, container, genericResponseSubscriber);

verify(genericResponseSubscriber, times(1)).onError(any(Throwable.class));

上面的代码工作正常,允许我抛出错误并在测试中捕获它。

我(当然)也需要能够做到 :) 是捕捉积极的条件。我觉得这很明显,但找不到我需要的答案。

如何捕获 onComplete 和 onNext 案例?

我知道 onComplete 的验证是...

验证(genericResponseSubscriber, times(1)).onCompleted();

但我看不出我的“何时”子句应该是什么。我尝试了以下但失败了:

GenericResponse response = new GenericResponse();
response.setSuccess(true);

when(myAPI.orderComplete(anyString(), any(MyContainer.class)))
        .thenReturn(Observable.just(response));

Subscriber genericResponseSubscriber = mock(Subscriber.class);

myPresenter.myUseCase(id, container, genericResponseSubscriber);

verify(genericResponseSubscriber, times(1)).onCompleted();

此处的失败是调用了 subscriber.onStart()。

所以,我想知道的是,我如何模拟和验证“onComplete”和“onNext”调用,更重要的是,我应该看起来能够自己解决这个问题,而不是必须问! :)

一如既往,我们将不胜感激。

编辑..

我的 onError 工作测试用例..

    public void UseCaseOnError() throws Exception {
        
     String id = "5";
    
        
     order Order = new Order();
        
     SomeContainer myContainer = new SomeContainer(order);
    
        

     when(myRetroFitAPI.complete(anyString(), any(SomeContainer.class)))

.thenReturn(Observable.error(new Throwable(“我的错误!”)));

     Subscriber genericResponseSubscriber = mock(Subscriber.class);
    
        

     orderPresenter.doUseCase(id, myContainer, genericResponseSubscriber);
    
        

     verify(genericResponseSubscriber,times(1)).onError(any(Throwable.class));
    
    

}

我真正应该补充的是,我觉得在积极状态方面应该有一个与 onError 等价的东西,即 onCompleted。如果我做同样的事情但使用 onCompleted 代替,我的验证失败,因为它检测到调用了 onStart 而不是我发现这很困惑。

我试过这样使用 ReplaySubject:

public void createOrderOnCompleteError() {
    orderOnCompleteSubject.onError(new Throwable("I am an error"));
}

public void createOrderOnCompleteSuccess() {
    orderOnCompleteSubject.onNext(new GenericResponse().setSuccess(true));
    orderOnCompleteSubject.onCompleted();
}

错误机制工作正常..完成的机制不...

最佳答案

您应该使用 TestObserver 类来测试 Observable,方法如下:

public Observable<Integer> getObservable() {
     return Observable.just(12, 20, 330);
}

@Test
public void testObservable() {
     Observable<Integer> obs = getObservable();
     TestObserver<Integer> testObserver = TestObserver.create();
     obs.subscribe(testObserver);

     testObserver.assertComplete();
     testObserver.assertResult(12, 20, 330);
 }

通过这种方式,您可以验证它是否完成并发出了所有预期的项目。

如果您想创建一个模拟版本的可观察对象,您只需创建一个具有您想要的行为的新 Observable。例如:

public Observable<Integer> mockedObservableCompleteWithResult() {
        return Observable.create(e -> {
            e.onNext(12);
            e.onNext(20);
            e.onNext(330);
            e.onComplete();
        });
    }

可以通过上述测试来验证。

然后我们可以创建其他模拟来模拟其他结果

public Observable<Integer> mockedObservableError() {
            return Observable.create(e -> {
                e.onNext(12);
                e.onError(new Throwable("Generic exception"));
            });
        }

可以验证:

@Test
public void testObservable() throws Exception {
       Observable<Integer> obs = mockedObservableError();
       TestObserver<Integer> testObserver = TestObserver.create();
       obs.subscribe(testObserver);

       testObserver.assertError(Throwable.class);
}

关于android - 单元测试 : How to verify and mock onCompleted for an Observable in RxJava within Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44949797/

相关文章:

android - 如何使用 Intent 将包含可绘制对象的对象从一个 android Activity 发送到另一个 Activity ?

android - 如何从我的应用程序将电子书上传到 google play book?

java - apache pdfbox - 如何测试文档是否被展平?

visual-studio - NUnit 无法加载,使用版本 3.11

unit-testing - java.lang.AssertionError : expected 错误

java - 无法模拟方法

java - 创建服务以检测用户的任何操作

android - 使用 EditText 过滤支持 SimpleCursorAdapter 的 ListView

java - 如何在mockito+Junit测试中捕获或模拟意外异常?

java - 指定私有(private)方法mockito的返回值