проверить перегруженные Java-методы с помощью спока

1

В моем проекте eclipse у меня есть класс java, который проверяет, являются ли объекты разных типов пустыми, используя перегруженные методы:

public class EmptyProof {

    public static boolean isEmpty(String field) {
        System.out.println("String " + field);
        return field == null || field.trim().equals("");
    }

    public static boolean isEmpty(BigDecimal d) {
        System.out.println("BI " + d.toString());
        return d == null || d.compareTo(new BigDecimal("0")) == 0;
    }

    public static boolean isEmpty(Object input) {
        System.out.println("obj " + input.toString());
        return input == null || String.valueOf(input).length() == 0;
    }
}

Теперь я хочу написать Unit Test в Spock:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import spock.lang.Specification;

class EmptyProofSpec extends Specification {

    def 'must evaluate emptiness of a String correctly'() {

        expect: "isEmpty for String returns the right answer"
            System.out.println("test string " + bi.toString());
            EmptyProof.isEmpty(str as String) == result

        where: "using this table"
            str                     || result
            ""                      || true 
            null                    || true
            "a"                     || false
    }

    def 'must evaluate emptiness of a BigInteger correctly'() {

        expect:
            System.out.println("test BigInt " + bi.toString());
            EmptyProof.isEmpty(bi as BigInteger) == result

        where: "using this table"
            bi                                              || result
            BigInteger.ONE                                  || false
            new BigInteger(Integer.MIN_VALUE) as BigInteger || false
//          null as BigInteger                              || true
//          BigInteger.ZERO  as BigInteger                  || true
    }

}

Это приносит мне следующий результат в консоли:

test string 
String 
test string null
test string a
String a
test BigInt 1
obj 1
test BigInt -2147483648
obj -2147483648

Как вы можете увидеть мои тесты с объектами String, вызовите isEmpty (String). Но мои вызовы с BigInteger не вызывают isEmpty (BigInteger), а isEmpty (Object). Я хотел бы добавить свой тест с BigInteger.ZERO, но это не сработает, поскольку Object-method не заботится о 0.

Я уже пробовал некоторые вещи, такие как кастинг и аннотация @CompileStatic. Но безуспешно.

Могу ли я проинструктировать Спока использовать метод BigInteger без изменения моего класса Java?

  • 0
    EmptyProof должен быть классом Java? Вы не увидите этой проблемы, если это класс Groovy из-за использования диспетчеризации во время выполнения или нескольких методов в Groovy по сравнению с Java. Соответствующий вызов метода будет выбран во время выполнения в соответствии с типом аргумента по сравнению с Java, где метод выбирается во время компиляции.
  • 1
    Groovy также выполняет множественную диспетчеризацию при вызове методов в классах Java.
Показать ещё 1 комментарий
Теги:
groovy
spock
method-overloading

1 ответ

2
Лучший ответ

Причина, по которой он переходит к isEmpty(Object) заключается в том, что для BigInteger не существует метода. Тот, который присутствует, определен для BigDecimal

public static boolean isEmpty(BigDecimal d) { ... }

Добавить/изменить один для BigInteger.

Также обратите внимание: null регистр вернется к Object.

  • 0
    Спасибо, очевидно, я потратил слишком много времени на этот код. Работает сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню