Unit testing 如何对RxJava Completable doOnSuccess函数进行单元测试?

Unit testing 如何对RxJava Completable doOnSuccess函数进行单元测试?,unit-testing,junit,rx-java,Unit Testing,Junit,Rx Java,我见过如何使用TestSubscriber测试observable,但我不知道如何测试Completable.doOnSuccess回调。具体而言,这种方法: fun setAuthToken(authToken: AuthToken): Completable { this.authToken = authToken return Completable.fromSingle<User>(api .getCurrentUser()

我见过如何使用
TestSubscriber
测试observable,但我不知道如何测试
Completable.doOnSuccess
回调。具体而言,这种方法:

fun setAuthToken(authToken: AuthToken): Completable {
    this.authToken = authToken

    return Completable.fromSingle<User>(api
            .getCurrentUser()
            .doOnSuccess {
                user = it
            })
}
fun setAuthToken(authToken:authToken):可完成{
this.authToken=authToken
返回Completable.fromSingle(api
.getCurrentUser()
杜恩塞斯先生{
用户=it
})
}

这可能根本不需要使用RxJava测试订阅服务器进行测试(取决于代码的其余部分)

请记住-您不想测试内部状态,或者至少尽可能少地进行测试。内部状态和类结构可以改变,而且可能会经常改变。因此,检查用户是否被分配到该字段是一种不好的做法

因此,您可以将
设置为Completable
阻塞,然后断言(我们称之为“服务器”)服务器类的状态,但是我强烈建议不要这样做:

server.setAuthToken(AuthToken("token"))
            .blockingAwait()
assertThat(server.user, equalTo(expectedUser))
您要测试的是行为。

您可能不是为了拥有一些字段而将用户分配到字段。您这样做是为了以后使用来自用户的信息。因此,首先应该调用setAuthToken,然后调用真正使用用户信息的函数。
然后可以断言使用的信息是否正确,是否来自正确的用户

因此,样本测试(取决于类别)可能如下所示:

server.setAuthToken(AuthToken("token"))
        .andThen(server.sendRequest())
        .blockingAwait()
    // assert if correct user info was sent


这毫无意义。Completable没有值,因此它不能成功,只能完成。保持
单一
类型并使用它。您到底想在这里测试什么?@akarnokd它确实有意义。这是单曲的
doOnSuccess
,但我返回一个Completable,因为这个函数的调用者只关心它是否成功,而不关心result@michalbrz我想测试用户在设置身份验证令牌后的设置,这就是我试图做的,但在我的例子中,用户被抓取是因为对服务器的一些调用依赖于用户id。问题是,由于我在模拟服务器,它并没有真正检查用户id是否正确。如果由于某种原因,用户ID设置失败,那么在单元测试中根本不会出现这种情况。我认为这正是在这种情况下应该做的事情——检查服务器是否接收到正确的用户ID。如何做到这一点——如果是本地服务器通过http进行通信,或者只是模拟类,这只是细节。但至少你可以检查你的类是否在不依赖它们的结构的情况下正常工作。我只是在模仿api的改型接口。谢谢你的帮助,不过我想我会试试的!
server.setAuthToken(AuthToken("token"))
    .andThen(server.sendRequest())
    .test()
    // assert if correct user info was sent