В моем проекте 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?
Причина, по которой он переходит к isEmpty(Object)
заключается в том, что для BigInteger
не существует метода. Тот, который присутствует, определен для BigDecimal
public static boolean isEmpty(BigDecimal d) { ... }
Добавить/изменить один для BigInteger
.
Также обратите внимание: null
регистр вернется к Object
.
EmptyProof
должен быть классом Java? Вы не увидите этой проблемы, если это класс Groovy из-за использования диспетчеризации во время выполнения или нескольких методов в Groovy по сравнению с Java. Соответствующий вызов метода будет выбран во время выполнения в соответствии с типом аргумента по сравнению с Java, где метод выбирается во время компиляции.