当嘲讽了通过AWS API网关(SDK)中生成的对象,我得到一个不寻常的行为,这是最有可能是斯波克的Bug。
例如,给定下列测试案例:
def "testing api gateway"() {
given:
def sdk = Mock(MyAWSSDK.class)
sdk.lookupByField("xyz") >> "result"
when:
def myClass = newClass(sdk)
myClass.foo()
then:
1 * sdk.lookupByField(_)
}
在这里我的情况,我得到空指针异常时,“1个* sdk.lookupByField()”是目前在测试案例。如果我把它拿出来替换,然后:用“真”的条件。测试用例运行没有问题。我还可以在之后添加另外一行:相“sdk.lookupByField(空)”,并添加了“1 * sdk.lookupByField()”返回“然后”阶段。它似乎工作。然而,这是不理想的。
这是一个奇怪的行为与斯波克和似乎与由AWS API网关生成的代码。
我想这两个JDK版本1.8.0_202和11.0.1
Maven依赖关系:
<dependency>
<groupId>org.objenesis</groupId>
<artifactId>objenesis</artifactId>
<version>3.0.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.2.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.9.9</version>
</dependency>
我打算创建与斯波克一个错误,但想伸手到社区,看看是否可以复制。如果有任何考生在那里它会非常感激。
首先,你提出一个测试,但测试没有课。请提供你问一个问题上是因为为了再现你的问题我要创建它自己,即使它本来是你的工作全MCVE下一次。谢谢。
没有斯波克错误,但也有在测试代码两个错误:
newClass(sdk)
该怎么办?我假设你想在那里建立一个MyClass
对象,也许而是想写def myClass = new MyClass(sdk)
。sdk.lookupByField("xyz") >> "result"
,为了首先设置存根返回值,并设定预期的呼叫数量后1 * sdk.lookupByField(_)
后来因此是错误的。你必须在同一个地方来限定。否则,模拟的方法将返回null
(默认值),而不是"result"
,因为第一个语句由第二个覆盖。您的解决方案是这样的:
package de.scrum_master.stackoverflow.q54636103
class MyAWSSDK {
String lookupByField(String s) {
"real result"
}
}
package de.scrum_master.stackoverflow.q54636103
class MyClass {
MyAWSSDK myAWSSDK
MyClass(MyAWSSDK myAWSSDK) {
this.myAWSSDK = myAWSSDK
}
String foo(String s) {
myAWSSDK.lookupByField("xyz")
}
}
package de.scrum_master.stackoverflow.q54636103
import spock.lang.Specification
class ApiGatewayTest extends Specification {
def "testing api gateway the wrong way"() {
given:
def sdk = Mock(MyAWSSDK)
sdk.lookupByField("xyz") >> "mock result"
when:
def myClass = new MyClass(sdk)
def result = myClass.foo()
then:
1 * sdk.lookupByField(_)
result == "mock result" // uh-oh!
}
def "testing api gateway the right way"() {
given:
def sdk = Mock(MyAWSSDK)
when:
def myClass = new MyClass(sdk)
def result = myClass.foo()
then:
1 * sdk.lookupByField("xyz") >> "mock result"
result == "mock result" // yeah!
}
}
第一特征的方法如下将失败,第二将通过:
Condition not satisfied:
result == "mock result" // uh-oh!
| |
null false