gpt4 book ai didi

java - 在 Spock 中将 Lambda 函数定义为参数约束

转载 作者:行者123 更新时间:2023-12-02 01:54:10 51 4
gpt4 key购买 nike

我想用单元测试覆盖一段代码

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

最佳答案

如果有人遇到这个;

解决方案是为调用者模拟定义行为:当使用参数调用调用者时,

  • 首先,该参数是一个函数
  • 模拟实际上仅使用一个参数来调用它
  • 该参数是一个常规模拟,因此我们稍后可以对其创建断言。

代码:

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 == ...

关于java - 在 Spock 中将 Lambda 函数定义为参数约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52554360/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com