Видя странное поведение со Споком и кодом, сгенерированным из AWS API Gateway SDK - PullRequest
0 голосов
/ 11 февраля 2019

При моделировании объектов, сгенерированных через AWS API Gateway (SDK), я получаю необычное поведение, которое, скорее всего, является ошибкой Спока.

Например, с учетом следующего тестового примера:

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 ()".Если я достану его и заменю условие then: на «true».Тестовый пример работает без проблем.Я также могу добавить строку добавления в фазе when: sdk.lookupByField (null) и добавить «1 * sdk.lookupByField ()" обратно в фазу then:.и это похоже на работу.Однако это не идеально.

Это странное поведение со Споком, и, похоже, оно связано с кодом, сгенерированным AWS API Gateway.

Я пробовал обе версии 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>

Я планировал создать ошибку с помощью Спока, но хотел обратиться к сообществу, чтобы узнать, можно ли это повторить.Если бы кто-нибудь там был, это было бы очень признательно.

1 Ответ

0 голосов
/ 12 февраля 2019

Прежде всего, вы представляете тест, но нет тестируемых классов.Пожалуйста, предоставьте полный MCVE в следующий раз, когда вы зададите вопрос о SO, потому что для того, чтобы воспроизвести вашу проблему, мне пришлось создать ее самому, даже если это была бы ваша работа.Спасибо.

Нет ошибки Спока, но в тестовом коде есть две ошибки:

  • Что должен делать newClass(sdk)?Я предполагаю, что вы хотите создать MyClass объект там и, возможно, скорее захотите написать def myClass = new MyClass(sdk).
  • Как объясняется в руководстве Spock , если вы хотите объединить насмешки и окурки, онидолжно произойти в том же взаимодействии.Ваше предположение, что вы можете сначала написать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...