眼看与斯波克和代码AWS API网关SDK产生一个奇怪的行为

问题描述 投票:0回答:1

当嘲讽了通过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>

我打算创建与斯波克一个错误,但想伸手到社区,看看是否可以复制。如果有任何考生在那里它会非常感激。

spock
1个回答
1
投票

首先,你提出一个测试,但测试没有课。请提供你问一个问题上是因为为了再现你的问题我要创建它自己,即使它本来是你的工作全MCVE下一次。谢谢。

没有斯波克错误,但也有在测试代码两个错误:

  • 什么是newClass(sdk)该怎么办?我假设你想在那里建立一个MyClass对象,也许而是想写def myClass = new MyClass(sdk)
  • 作为Spock manual解释说,如果你想嘲弄和存根相结合,他们在同一个交互的情况发生。你的假设,你可以先写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
© www.soinside.com 2019 - 2024. All rights reserved.