2017-07-06 37 views
1

我试图写一个Android应用程序的一些单元测试是利用改造2,1.10的Mockito和RXJava 1.0验证和模拟onCompleted可观察的RxJava。我没有使用支持lambdas的java版本!单元测试:如何内的Android

我的代码使用观测量,我可以做到以下几点:

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,时间(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(新的Throwable(“我的错误!“)));

 Subscriber genericResponseSubscriber = mock(Subscriber.class);
 
   

    orderPresenter.doUseCase(id, myContainer, genericResponseSubscriber);
 
   

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

} 

我应该补充的是,我觉得在onError方面应该有一个相当于onComror的状态,即onCompleted。如果我这样做,但是用onCompleted代替,我的验证失败,因为它检测到o nStart已被调用,而我发现相当混乱。

我已经使用ReplaySubject这样尝试:

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

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

错误机制的工作很好..完成机制不...

回答

1

而是嘲讽认购的,你应该RxJava 1创建TestSubscriber:

然后,我们可以模拟其他结果

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

经查证属实创建其他模拟

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

TestSubscriber genericResponseSubscriber = TestSubscriber.create(); 

myPresenter.myUseCase(id, container, genericResponseSubscriber); 

// To check for an error 
genericResponseSubscriber.assertError(Throwable.class) 

// To check for completion 
genericResponseSubscriber.assertCompleted() 

您可能需要更具体一点关于您遇到的错误类别克拉。检查出TestSubscriber documention。有很多东西可以通过这门课来验证。

快乐测试!

+1

在一个小时内从你的两个答案:D 非常感谢你:) – greysqrl

2

您应该使用类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(); 
     }); 
    } 

可以通过上述测试进行验证。

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

     testObserver.assertError(Throwable.class); 
} 
+0

嗨。感谢您抽出时间回复..我看不出如何适合我的测试案例(我已经将这添加到了我的问题上面)。它包含了可用的onError测试用例,我需要如何修改这个以使用上面显示的机制来处理onComplete? – greysqrl

+0

我想我回答了你的问题。我的意思是,你想测试'onComplete'和'onNext'。 “官方”方式是使用'TestObserver'作为RxJava 2.你只需要将你的模拟'Observable'传递给测试。 – GVillani82

+0

谢谢......我想看看我现在能否使用它。尽管代码库不支持lambdas。我怎么能做到你上面没有lambda表达过的东西? – greysqrl