Groovy:使用验证(和内联模拟)的 Mockito UnfinishedStubbingException

Groovy: Mockito UnfinishedStubbingException using verify (and inline mocks)

我正在尝试 verify 调用 FileChooser 上的方法。

我在 Groovy 中编码,这似乎是问题所在。

我正在使用 "incubating" Mockito 功能,它使您甚至可以模拟 final class.

代码是:

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

这给出:

org.mockito.exceptions.misusing.UnfinishedStubbingException:
Unfinished stubbing detected here:
...
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:55) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:197) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:217) at core.ConsoleHandlerFTs.shouldShowFileChooserDialogOnEnteringO(ConsoleHandlerFTs.groovy:91)

(注意第 91 行是 verify 行)

...然后继续说final方法(showOpenDialog不是final),缺少whenReturn(不适用)等

我build.gradle中GRADLE_HOME中的Mockito是2.7.22版本。
FileChooserjavafx.stage.FileChooser.
Java 版本是 1.8.0_121.

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

通过 "adding back" 使 Groovy 在 Gradle 项目中发挥作用的点点滴滴,我似乎找到了问题所在:在

之后
apply plugin: 'groovy'

和(依存关系)

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

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

通过搜索,我认为 "bytebuddy" 包可能受到牵连,但将以下行添加到依赖项可确保 GRADLE_HOME:

中不存在早期版本
compile 'net.bytebuddy:byte-buddy:1.6.11'

当我 运行 Groovy 测试文件时仍然出现 UnfinishedStubbingException

"Workaround" ... 对于通常从 Java 移动到 Groovy 的任何人。

要学习 Groovy 我实际上正在关注一本书,Groovy in Action,第二版,由 [=15 与其他人合着=]!

我现在已经谈到了关于测试的部分,它被设计到语言中,并利用了 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( _ )
    }
}

...如果某些 Groovy übermind(乔恩,你在吗?)可以找出为什么 Mockito 会产生这个 UnfinishedStubbingException 在 Groovy.

注意,您似乎无法在 Mockito 测试中单独使用 GroovyMock...它似乎是 Spock 框架的一部分。