当前位置: 首页 > 知识库问答 >
问题:

Mockito.verify没有看到方法执行,即使它是

荆城
2023-03-14

@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 maker inline冲突
  3. Powermock可以将mock-maker-inline的调用委托给其他mock-maker-inline(https://github.com/powermock/powermock/wiki/PowerMock-Configuration)
  4. 使用Mockito。在失败的字段上进行模拟,而不是@mock/Powermock-mock-injection

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

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

共有2个答案

许永年
2023-03-14

可能是因为您没有传递相同的Bagato()实例。试着把你的代码重构成这个

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

  fakePotatoProvider.getObservable().subscribe(potatoConsumer)

  verify(potatoConsumer).accept(testPotato)    
}

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

谷翰飞
2023-03-14

我不熟悉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())
    }
 类似资料:
  • 我在运行Java应用程序时遇到了一个小问题(当我通过Maven运行它时,它工作得很好)。我得到一个错误: 模块位于my文件夹中,我的文件夹结构如下: 对于- 对于我的类 奇怪的是,当我在文件它再次开始工作,但在几次运行后中断。 编辑: 将位置更改为修复了该问题,但是,它破坏了我的Maven install命令并引发以下错误:

  • 无法在 AnjularJS 应用程序中看到拖动的元素,即使执行了拖放操作且没有任何错误。 代码如下: 以下是执行和执行的不同方法,没有错误: 还执行了JavaScript方法:但是没有运气,它也执行没有错误,但无法执行拖放操作在UIenter图像描述在这里 上述所有方法和命令都是编译和执行的,没有任何错误,但无法在UI中执行拖放操作(请帮助)。 尝试了所有可能的组合,我知道任何人都可以让我知道我错

  • 问题内容: 我有一个多模块Maven项目,其中一个模块用于分发。 该发行版包含一个我想轻松执行的可执行jar。但是,要执行它,我必须键入类似以下内容: 简单键入以下内容将是更好的选择: 不幸的是,我找不到找到执行.jar的java目标的方法。exec目标实际上可以做到,但是有一个陷阱:jar包含一个嵌入式码头服务器,并且由于exec的工作方式(不使用与maven相同的JVM),除非我杀死进程,否则

  • 返回位于给定的基于一的行和列索引处的该矩阵的条目。如果行或列不是1或2,则引发异常。 这是我的方法的代码,但即使我使用参数row=1和col=2调用该方法;它显示了IndexOutOfBoundsException。有没有办法解决这个问题?

  • 所以,最近我开始和Presta一起工作,前台的一切都很顺利,但在后台却出现了困难。 我正在尝试连接到在AdminController中激发的action AdminCustomerformModifier。像这样的php

  • 看起来HttpClient及其子类有问题。