“如何进行单元测试”;重复“当”;在RxJava服务器轮询中

“如何进行单元测试”;重复“当”;在RxJava服务器轮询中,java,android,unit-testing,mockito,rx-java,Java,Android,Unit Testing,Mockito,Rx Java,这是我的密码 return Observable.defer(() -> mApi.verifyReceipt(username, password)) .subscribeOn(Schedulers.io()) .doOnNext(this::errorCheck) .repeatWhen(observable -> observable.delay(1, TimeUnit.SECONDS))

这是我的密码

return Observable.defer(() -> mApi.verifyReceipt(username, password))
            .subscribeOn(Schedulers.io())
            .doOnNext(this::errorCheck)
            .repeatWhen(observable -> observable.delay(1, TimeUnit.SECONDS))
            .takeUntil(Response::body)
            .filter(Response::body)
            .map(Response::body);
它保持轮询并接收“false”布尔响应,并在接收到“true”时停止轮询。我为onNext()案例制作了一个测试用例,如下所示:

@Test
public void testVerifyReceiptSuccessTrueResponse() {
    Response<Boolean> successTrueResponse = Response.success(Boolean.TRUE);
    when(mMockApi.verifyReceipt(any(), any())).thenReturn(Observable.just(successTrueResponse));

    mService.verifyReceipt("", "").subscribe(mMockVerifyReceiptSubscriber);

    verify(mMockVerifyReceiptSubscriber).onNext(eq(Boolean.TRUE));
}
@测试
public void testVerifyReceiptSuccessTrueResponse()测试{
Response successTrueResponse=Response.success(Boolean.TRUE);
when(mMockApi.verifyreceive(any(),any())。然后return(Observable.just(successTrueResponse));
mService.verifyReceipt(“,”).subscribe(mMockVerifyReceiptSubscriber);
验证(mMockVerifyReceiptSubscriber).onNext(eq(Boolean.TRUE));
}
如果回答为“假”,那么在继续轮询时,有没有关于如何测试情况的建议


现在,第一次observable将发出
false
,它将调用您的
retryWhen()
,下次发出
true

关于
observable-observable=mService.verifyReceipt(“,”);验证(可观察)。延迟(1,TimeUnit.SECONDS)
?这将验证延迟是否有效,但我需要验证在收到“false”响应时轮询是否重复(无论是1秒后还是任何值)。我有一种感觉,这将最终创建一个无限循环,测试将继续运行^这是一个非常有益的建议。非常感谢。
when(mMockApi.verifyReceipt(any(), any()))
            .thenReturn(Observable.just(successFalseResponse))
            .thenReturn(Observable.just(successTrueResponse));

Observable observable = mService.verifyReceipt("", "");

observable.subscribe(mMockVerifyReceiptSubscriber);

// Two approaches here

// First one - sleep as much as specified in delay(), in your case 1 second 
// and then perform verification specified on next line

// Second approach (better) - make your architecture in a way, that you can 
// provide an implementation to `repeatWhen()` operator, in other words, 
// inject. And then you'll be able to inject `observable.delay(1, TimeUnit.SECONDS)`
// for production code and inject retry logic without delay for test code.

// Now we are verifying that because of first time `false` was returned,
// then retryWhen() logics are performed
verify(observable).delay(1, TimeUnit.SECONDS); // here should be the injected implementation

verify(mMockVerifyReceiptSubscriber).onNext(eq(Boolean.TRUE));