代码之家  ›  专栏  ›  技术社区  ›  Manu Artero Rajeev Dutta

在Spock中定义Lambda函数作为参数约束

  •  0
  • Manu Artero Rajeev Dutta  · 技术社区  · 6 年前

    有一段代码我想用一个单元测试来说明

    public List<Product> fetchProducts() {
       ...
       String userId = anotherObj.getId()
       return caller.call(client -> client.getProducts(userId));
    }
    

    现在,这是一个使用通配符的单元测试(省略了所有不相关的内容):

    def anotherObj = Mock( ... )
    def caller = Mock( ... )
    
    ...
    
    when:
      subject.fetchProducts()
    
    then:
      1 * anotherObj.getId() >> USER_ID
    and:
      1 * caller.call(_) >> mockedApiResponse
    

    我想检查一下功能 call 实际使用接收参数的函数调用;使用正确的参数调用该参数

    伪码

    then:
      1 * anotherObj.getId() >> USER_ID
    and:
      1 * caller.call( { it(obj -> obj.getProducts(USER_ID)) } ) >> mockedApiResponse
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Manu Artero Rajeev Dutta    6 年前

    如果有人遇到这个;

    解决方案是定义 caller 模拟:当 来电者 是用一个参数调用的,那么

    • 首先,这一论点是错误的 Function
    • mock实际上只使用一个参数调用它

    代码:

    def anotherObj = Mock( ... )
    def caller = Mock( ... )
    def client = Mock( ... )
    
    ...
    
    when:
      def response = subject.fetchProducts()
    
    then:
      1 * anotherObj.getId() >> USER_ID
    and:
      1 * caller.call(_) >> { Function lambda ->
          lambda.apply(client)
          return apiResponse
      }
    and:
      1 * client.getProducts(USER_ID)
    and:
      response == ...