我无法为泛型类编译Spock存根.构造函数的签名如下:
SomeClass(SerSup<Cap> capSup, String foo, String bar);
我需要存根第一个参数.以下是我失败的尝试.
第一次尝试:
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)
将SomeClass构造函数的第一个参数存根的正确方法是什么?
解决方法:
您的第二次尝试失败,因为您无法将Stup(Cap)强制转换为SerSup< Cap>.您可能需要使用Stub(SerSup),或者您可以应用我在下面描述的建议.
我建议在初始化SomeClass之前为存根创建一个变量.您可以使用Stub(type:…)构造函数来存储泛型类,例如:
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() >> ""
}
这个替代解决方案需要stubbing方法来返回有效类型,否则它返回新Object()的等价物.在第一种情况下,返回“default”值,因为我们满足所有类型检查(例如,在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
}
}
}
原文地址:https://codeday.me/bug/20190607/1195376.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。