代码之家  ›  专栏  ›  技术社区  ›  mike rodent

Groovy:使用verify(和内联mock)的Mockito unfinishedstubingexception

  •  1
  • mike rodent  · 技术社区  · 6 年前

    我正在努力 verify FileChooser .

    我正在用Groovy编写代码,这似乎就是问题所在。

    我正在使用“孵化”Mockito功能,它可以让你模拟 final

    代码为:

        FileChooser mockFC = mock(FileChooser.class)
        doReturn(mockFC).when(spyCH).getFileChooser()
        ...
        verify( mockFC, times( 1 )).showOpenDialog( any() )
    

    这将提供:

    组织。莫基托。例外情况。滥用。未完成的存根异常:
    此处检测到未完成的存根:
    ...
    位于组织。科德豪斯。非常棒。运行时。调用站点。CallSiteArray。defaultCallStatic(CallSiteArray.java:55) 位于组织。科德豪斯。非常棒。运行时。调用站点。AbstractCallSite。callStatic(AbstractCallSite.java:197) 位于组织。科德豪斯。非常棒。运行时。调用站点。AbstractCallSite。callStatic(AbstractCallSite.java:217) 在核心。控制台Handlerfts。shouldShowFileChooserDialogOnEnteringO(控制台handlerfts.groovy:91)

    (NB第91行是 验证 线路)

    ... 然后继续谈论 最终的 方法( showOpenDialog 不是 最终的 ),缺少 whenReturn (不适用)等。

    我身体里的Mockito。gradle\u主页中的gradle版本为2.7.22。
    文件选择器 javafx.stage.FileChooser .
    Java版本为1.8.0\u 121。

    我创建了一个全新的Gradle项目。。。并且做了同样的事情,只使用Java文件。模拟工作正常,测试通过!

    通过在Gradle项目中“添加”使Groovy功能发挥的零碎部分,我似乎找到了问题所在:之后

    apply plugin: 'groovy'
    

    和(在依赖项中)

    compile 'org.codehaus.groovy:groovy:3.0.0-alpha-1'
    

    问题再次出现。也就是说,即使没有创建任何。groovy文件。然后我尝试了groovy的早期版本,一直到2.3.11。相同的结果。

    通过搜索,我认为“bytebuddy”包可能有牵连,但在依赖项中添加以下行可以确保GRADLE\u HOME中不存在早期版本:

    compile 'net.bytebuddy:byte-buddy:1.6.11'
    

    仍在获取 UnfinishedStubbingException 当我运行Groovy测试文件时出现。

    1 回复  |  直到 6 年前
        1
  •  0
  •   mike rodent    6 年前

    “解决方法”。。。对于那些通常从Java迁移到Groovy的人来说。

    为了学习Groovy,我实际上在读一本书, Groovy在运行,第二版 ,作者之一 JON SKEET !

    我现在谈到了关于测试的部分,它是设计到语言中的,并且利用了Groovy的一些惊人功能。

    Groovy的Spock测试框架似乎是一条出路。。。还有嘲笑 final 事实证明,使用 GroovyMock . 我能够编写一个测试来完成这项工作:

    class XXX extends Specification {
    
        @Rule
        public TextFromStandardInputStream systemInMock = emptyStandardInputStream()
        def xxx(){
            given:
            FileChooser fc = GroovyMock( FileChooser )
            ConsoleHandler ch = Spy( ConsoleHandler ){
                getFileChooser() >> fc
            }
            ch.setMaxLoopCount 10
            systemInMock.provideLines( "o" )
    
            when:
            com.sun.javafx.application.PlatformImpl.startup( {} )
            ch.loop()
            Thread.sleep( 2000L ) // needs improvement with a Latch or something!
    
            then:
            1 * fc.showOpenDialog( _ )
        }
    }
    

    ... 如果有一些很棒的 ü伯明德 (乔恩,你在吗?)可以找出Mockito为什么生产这个 UnfinishedStubbingException 在Groovy中。

    注意,您似乎无法使用 GroovyMock公司 在Mockito测试中隔离。。。它似乎是斯波克框架的一部分。