使用Spock Java/Groovy模拟双函数

q7solyqu  于 6个月前  发布在  Java
关注(0)|答案(2)|浏览(71)

试图模拟一个返回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


那也不行
标签:Tried With

mockBiFunction.apply(object1, object2) >> mockReturnVal


这失败了,

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

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

0x6upsns

0x6upsns1#

实际上,你的接口方法返回一个Optional,而不是一个BiFunction。更准确地说,它返回Optional<BiFunction<Object, Object, Object>>。因此,你的接口mock需要返回一个Optional,以及当重写myAwesomeFunc()。这就是IMO对你的代码的错误。
以下是我的观点:

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()
    }
  }
}

字符串

5m1hhzi4

5m1hhzi42#

啊,看起来我所要做的就是使用一个函数作为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
}

相关问题