【问题标题】:Mockito.verify didn't see method exectution, even if it wasMockito.verify 没有看到方法执行,即使它是
【发布时间】: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"

有点解决方法

  1. powermock 模拟的某些字段在“验证”时失败,但使用 mockito 模拟的字段不是;
  2. Mockito 无法模拟未打开的字段,没有 mock-maker-inline,但 mockito 与 Powermock mock-maker-inline 冲突;
  3. Powermock 可以将 mock-maker-inline 的调用委托给其他 mock-maker-inline(https://github.com/powermock/powermock/wiki/PowerMock-Configuration)
  4. 在失败的字段上使用 Mockito.mock 而不是 @Mock/Powermock 模拟注入

使用 PowerMockRunner 的“绿色”马铃薯测试方法示例

    @Test
    fun potato() {
        potatoConsumer = mock() // <-
        Observable.just(Potato()).subscribe(potatoConsumer)
        verify(potatoConsumer).accept(potato)
    }

【问题讨论】:

  • 您使用的是rx-java2mockitopowermock 的哪个版本?另外 - 如果您没有注意到 - 您可以从示例中删除整个 fakePotatoProvider 并使用 Observable.just(Potato()).subscribe(potatoConsumer) 代替(但这不会解决您的问题)。
  • 感谢您的回答,您是对的,我通过您的示例简化了代码并提供了 lib 版本

标签: android mockito rx-java2 powermock


【解决方案1】:

我不熟悉PowerMock,但我尝试了这个测试,它通过了:

    @Test
    fun potato() {

        fakePotatoProvider = Mockito.mock(PotatoProvider::class.java)
        potatoConsumer = Mockito.mock(PotatoConsumer::class.java)

        `when`(fakePotatoProvider.getObservable()).thenReturn(Observable.just(Potato()))
        fakePotatoProvider.getObservable().subscribe(potatoConsumer)
        verify(potatoConsumer).accept(Potato())
    }

【讨论】:

  • 你是绝对正确的,如果我打开类和方法,并删除所有 Powermockito 东西 - 测试是绿色的。我不知道,WTF 正在进行中。我已在问题中添加了 Powermock 标签,希望有人能看到并帮助解决。谢谢你的回答。
【解决方案2】:

可能是因为您没有传递Potato() 的同一个实例。尝试将您的代码重构为此

@Test
fun potato() {
  val testPotato = Potato()  
  `when`(fakePotatoProvider.getObservable()).thenReturn(Observable.just(testPotato))

  fakePotatoProvider.getObservable().subscribe(potatoConsumer)

  verify(potatoConsumer).accept(testPotato)    
}

正如我上面提到的,可能失败的原因是在传递 Potato 对象时不断创建新实例,因此比较失败了。

【讨论】:

  • 试过了,结果一样。它并没有解释为什么any() 显示相同的错误
猜你喜欢
  • 1970-01-01
  • 2020-03-16
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多