gpt4 book ai didi

java - 带有 Spock Stub 的泛型

转载 作者:搜寻专家 更新时间:2023-11-01 02:20:05 28 4
gpt4 key购买 nike

我无法为泛型类编译 Spock stub 。构造函数的签名如下:

SomeClass(SerSup<Cap> capSup, String foo, String bar);

我需要 stub 第一个参数。以下是我失败的尝试。

第一次尝试:

def someClass = new SomeClass(Stub(SerSup<Cap>), "foo", "bar")

Error: Groovyc: unexpected token: >
Status bar: ',' or ')' expected

另一个尝试:

def someClass = new someClass(Stub(Cup) as SerSup<Cup>, "foo" ,"bar")

groovy.lang.MissingMethodException: No signature of method: com.sun.proxy.$Proxy10.get() is applicable for argument types: () values: []
Possible solutions: grep(), getAt(java.lang.String), grep(java.lang.Object), wait(), any(), wait(long)

at loom.SomeClass.SomeMethod(SomeClassTest.groovy:14)

stub SomeClass 构造函数的第一个参数的正确方法是什么?

最佳答案

您的第二次尝试失败,因为您无法施放 Stub(Cap)SerSup<Cap> .你必须 Stub(SerSup)相反,或者您可以应用我在下面描述的建议。

我建议在初始化 SomeClass 之前为 stub 创建一个变量.您可以使用 Stub(type: ...) stub 泛型类构造函数,例如

SerSup<String> serSup = Stub(type: new TypeToken<SerSup<String>>(){}.type) as SerSup<String>

此初始化不会在您的 IDE 中产生任何警告。如果您可以接受一些警告,您可以将其简化为:

def serSup = Stub(type: new TypeToken<SerSup<String>>(){}.type)

或者,您可以尝试以下方法:

SerSup<String> serSup = Stub(SerSup) {
get() >> ""
}

此替代解决方案要求 stub 方法返回有效类型,否则返回等效于 new Object() .在第一种情况下,返回“默认”值,因为我们满足所有类型检查(例如,在 String 的情况下,返回空字符串)。

这是一个展示这两种方法的例子:

import com.google.common.reflect.TypeToken
import spock.lang.Specification

class StubSpec extends Specification {

def "test stubbing with default value for String"() {
when:
SerSup<String> serSup = Stub(type: new TypeToken<SerSup<String>>(){}.type) as SerSup<String>

then:
serSup.get() == ""
}

def "test stubbing without explicit type"() {
when:
SerSup<String> serSup = Stub(SerSup) {
get() >> "lorem ipsum"
}

then:
serSup.get() == "lorem ipsum"
}

static class SerSup<T> {
private final T obj

SerSup(T t) {
this.obj = t
}

T get() {
return obj
}
}
}

关于java - 带有 Spock Stub 的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48263921/

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