【问题标题】:Mockito never() not working with andThen rxjava2Mockito never() 不使用 andThen rxjava2
【发布时间】:2017-11-11 18:04:03
【问题描述】:

我正在测试一段用 Kotlin 编写的相当简单的代码:

o1.updateUser(params)
     .andThen(o2.reload())

当 updateUser 失败时,我希望不会执行重新加载。但是在使用 Mockito 2 和 jUnit 5 进行测试时,会调用上述模拟。

模拟是这样完成的:

given(o1.updateUser(user)).willReturn(Completable.error(IllegalArgumentException())
given(o2.reload()).willReturn(Completable.complete())

现在的问题是代码的行为符合预期,这意味着在这种情况下实际上从未调用过 o2,但是在单元测试时 Mockito 声称调用了 o1。

测试断言如下:

verify(o2, never()).reload()

我在这里做错了吗?有没有解决的办法?我是否以某种方式错误地理解了操作员?

【问题讨论】:

  • 我认为verify(o2, never()).reload() 对于这种情况来说只是一个糟糕的测试。例如,您可以有一个实现 o1.updateUser(params).andThen((CompletableObserver cs) -> o2.reload()),它会通过测试,但不应该。

标签: unit-testing junit kotlin mockito rx-java2


【解决方案1】:

你在测试中写的其实是:

Completable c2 = o2.reload(); 
o1.updateUser(params).andThen(c2);

你可能想要的是:

o1.updateUser(params).andThen(Completable.defer(() -> o2.reload()));

这样,o2.reload() 只有在andThen 的执行正常完成并订阅延迟的Completable 时才会被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多