Как проверить перегруженный метод с помощью спока «где» - PullRequest
0 голосов
/ 08 октября 2019

Я хочу проверить прохождение null для этих перегруженных методов:

public static Object someMethod(String n) { /* some impl */ }
public static Object someMethod(Integer n) { /* some impl */ }

Я пытался:

def "test someMethod"() {
    expect:
    someMethod(input) == expected
    where:
    input           | expected
    null as String  | someValue
    null as Integer | someValue
}

Но я получаю ошибку:

groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method com.foo.MyClass#someMethod.
Cannot resolve which method to invoke for [null] due to overlapping prototypes between:  
    [class java.lang.String]  
    [class java.lang.Integer]

Как я могу проверить их, используя один метод спока с входными нулями в блоке where (с другими значениями)?

1 Ответ

1 голос
/ 08 октября 2019

Я пытался воспроизвести вашу проблему с помощью Спока 1.3 и Groovy 2.5.8, но не смог. У меня была другая проблема со Споком, см. здесь . Вы должны использовать другие версии Spock и / или Groovy.

В любом случае, один из обходных путей для ошибки Spock, на которую я только что ссылался, - не вызывать метод с нулевым параметром из then: или * 1006. * блокировать, но с when: и выполнить сравнение позже в блоке then:. См. Также мой пример кода там.

В дополнение к этому, вам нужно разделить свой метод пространственных объектов на два метода, по одному для каждого типа null объекта, который вы хотите протестировать.

Тестируемый класс Java:

package de.scrum_master.stackoverflow.q58279620;

public class ClassUnderTest {
  public static Object someMethod(String n) {
    return n == null ? "nothing" : "something";
  }

  public static Object someMethod(Integer n) {
    return n == null ? -999 : 11;
  }
}

Обходной путь теста Спока:

package de.scrum_master.stackoverflow.q58279620


import spock.lang.Specification
import spock.lang.Unroll

class PassingNullToOverloadedMethodTest extends Specification {
  @Unroll
  def "someMethod('#input') returns #expected"() {
    when:
    def result = ClassUnderTest.someMethod(input as String)

    then:
    result == expected

    where:
    input | expected
    "foo" | "something"
    ""    | "something"
    null  | "nothing"
  }

  @Unroll
  def "someMethod(#input) returns #expected"() {
    when:
    def result = ClassUnderTest.someMethod(input as Integer)

    then:
    result == expected

    where:
    input | expected
    0     | 11
    123   | 11
    null  | -999
  }
}
...