Mocking BiFunction with Spock Java/Groovy



Spock是个新手。尝试模拟返回BiFunction的函数失败
该功能看起来像

public interface myInterface { 
Optional<BiFunction<Object, Object, Object>> myAwesomeFunc()
}

试图模仿

def mockBiFunction = Mock(BiFunction)
mockMyInterface.myAwesomeFunc >> mockBiFunction 
mockBiFunction.apply(*_) >> mockReturnVal 

这导致

No signature of method: com.sun.proxy.$Proxy49.apply() is applicable for argument types: (org.spockframework.lang.SpreadWildcard) values: [*_]
Possible solutions: apply(java.lang.Object, java.lang.Object), any(), any(groovy.lang.Closure), every(), tap(groovy.lang.Closure), every(groovy.lang.Closure)
groovy.lang.MissingMethodException: No signature of method: com.sun.proxy.$Proxy49.apply() is applicable for argument types: (org.spockframework.lang.SpreadWildcard) values: [*_]
Possible solutions: apply(java.lang.Object, java.lang.Object), any(), any(groovy.lang.Closure), every(), tap(groovy.lang.Closure), every(groovy.lang.Closure)

尝试使用

mockBiFunction(*_) >> mockReturnVal

这也不起作用。

编辑:尝试使用

mockBiFunction.apply(object1, object2) >> mockReturnVal

失败

Cannot invoke method rightShift() on null object
java.lang.NullPointerException: Cannot invoke method rightShift() on null object

当我嘲笑它时,为什么它是空的

实际上,您的接口方法返回的是Optional,而不是BiFunction。更准确地说,它返回Optional<BiFunction<Object, Object, Object>>。因此,在存根myAwesomeFunc()时,您的接口mock也需要返回一个Optional。这就是IMO对您的代码的错误所在。

在我看来,你自己的答案并不合乎逻辑,但这可能是因为在你的问题和答案中,你只提供了不连贯的片段集,而不是正确的MCVE。请务必学习如何提出好的问题。你似乎是一个经验丰富的开发人员,正在与双功能等选项作斗争。因此,你应该知道如何使你的问题可重现。如果你不能做到这一点,你就不能指望得到好的答案,甚至人们会觉得有尝试的倾向。

不管怎样,这是我的看法:

package de.scrum_master.stackoverflow.q71602791
import spock.lang.Specification
import java.util.function.BiFunction
class BiFunctionMockTest extends Specification {
def "mock BiFunction"() {
given:
def biFunction = Mock(BiFunction) {
apply(*_) >> "dummy"
}
def myInterface = Mock(MyInterface) {
myAwesomeFunc() >> Optional.of(biFunction)
}
def underTest = new MyInterfaceUser(myInterface: myInterface)
expect:
underTest.doSomething().get().apply("foo", "bar") == "dummy"
}
interface MyInterface {
Optional<BiFunction<Object, Object, Object>> myAwesomeFunc()
}
static class MyInterfaceUser {
MyInterface myInterface
def doSomething() {
myInterface.myAwesomeFunc()
}
}
}

Ah看起来我所要做的就是使用一个函数作为BiFunction的模拟返回值

def mockMyAwesomeFunc = abc -> mockReturnVal 
mockBiFunction.apply(object1, object2) >> mockMyAwesomeFunc

而不是进行

mockBiFunction.apply(object1, object2) >> mockReturnVal

现在感觉真的很愚蠢!!

编辑——更新答案以更紧密地反映实际工作代码——这就是的工作原理

def mockBiFunction = Mock(BiFunction)
mockMyInterface.myAwesomeFunc >> Optional.of(mergeBiFunction)
mergeBiFunction.apply(_, _) >> (a, b) -> {
return mockValue
}

最新更新