【发布时间】:2019-08-07 05:48:56
【问题描述】:
@RunWith(PowerMockRunner::class)
@PrepareForTest(PotatoProvider::class, PotatoConsumer::class)
class WantedButNotInvoked {
@Mock
lateinit var potatoConsumer: PotatoConsumer
@Test
fun potato() {
Observable.just(Potato()).subscribe(potatoConsumer)
verify(potatoConsumer).accept(Potato())
//verify(potatoConsumer).accept(any()) //-> This fails too with the same reason
}
}
data class Potato(val value: Int = 1)
class PotatoConsumer : Consumer<Potato> {
override fun accept(t: Potato?) {
println(t)
}
}
所以我用这个 mock(potatoConsumer) 进行订阅,rxJava 调用了 'accept',mockito 将其标记为交互,但 mockito 认为这种交互不是我所期望的,为什么?
使用她的库版本:
mockitoVersion = '2.8.9'
mockitoAndroidVersion = '2.7.22'
powerMockVersion="2.0.2"
kotlinMockito="2.1.0"
rxKotlin = "2.3.0"
rxJavaVersion = "2.2.10"
有点解决方法
- powermock 模拟的某些字段在“验证”时失败,但使用 mockito 模拟的字段不是;
- Mockito 无法模拟未打开的字段,没有
mock-maker-inline,但 mockito 与 Powermock mock-maker-inline 冲突; - Powermock 可以将 mock-maker-inline 的调用委托给其他 mock-maker-inline(https://github.com/powermock/powermock/wiki/PowerMock-Configuration)
- 在失败的字段上使用 Mockito.mock 而不是 @Mock/Powermock 模拟注入
使用 PowerMockRunner 的“绿色”马铃薯测试方法示例
@Test
fun potato() {
potatoConsumer = mock() // <-
Observable.just(Potato()).subscribe(potatoConsumer)
verify(potatoConsumer).accept(potato)
}
【问题讨论】:
-
您使用的是
rx-java2、mockito和powermock的哪个版本?另外 - 如果您没有注意到 - 您可以从示例中删除整个fakePotatoProvider并使用Observable.just(Potato()).subscribe(potatoConsumer)代替(但这不会解决您的问题)。 -
感谢您的回答,您是对的,我通过您的示例简化了代码并提供了 lib 版本
标签: android mockito rx-java2 powermock