java.lang.ClassCastException: geb.content.TemplateDerivedPageContent, генерируемый при сравнении двух чисел в виде строк. - PullRequest
0 голосов
/ 09 сентября 2018

Мне нужно сравнить количество значений с одним родителем в методе:

def checkFilterAppliedByPriceDescending() {

    firstPriceValue.text().replace(/\D*/, "")

    allPrices.each() {
        if (it.text().replace(/\D*/, "") > firsPriceValue) {
            throw new Exception("Wrong price found: " + it)
        }
    }
}

Я использую регулярное выражение, чтобы исключить все нецифровые числа, чтобы это выглядело, например, 99999 Однако, когда я запускаю тест, я получаю следующую ошибку:

checkFilterAppliedByPriceDescending()
|
java.lang.ClassCastException: geb.content.TemplateDerivedPageContent cannot be cast to java.base/java.lang.String
    at SearchPageFiltersTest.Can navigate to AutoHero Search Page(RouterTest.groovy:21)

    Caused by:
    java.lang.ClassCastException: geb.content.TemplateDerivedPageContent cannot be cast to java.base/java.lang.String

Не могли бы вы помочь мне понять, что не так с методом и как его можно исправить?

1 Ответ

0 голосов
/ 09 сентября 2018

Вы должны знать, что

firstPriceValue.text().replace(/\D*/, "")

не мутирует firstPriceValue. Метод text() возвращает строковое представление, и строки являются неизменяемыми, поэтому вызов replace() для строки возвращает новую и не изменяет строку, для которой был вызван метод. Чтобы исправить это, вы должны захватить результат из вышеприведенного метода и присвоить его переменной, например:

def price = firstPriceValue.text().replace(/\D*/, "")

Другое дело, что сравнение строк с > не будет работать так, как вы ожидаете. Взгляните на этот пример из оболочки Groovy:

groovy:000> '9999' > '10000'
===> true

Чтобы избежать таких проблем, вам нужно привести число, представленное в виде String, к числовому значению, BigDecimal, например:

groovy:000> ('9999' as BigDecimal) > ('10000' as BigDecimal)
===> false

И, наконец, вы можете использовать метод every() коллекции, чтобы убедиться, что все цены соответствуют определенному предикату. Примерно так:

def price = firstPriceValue.text().replace(/\D*/, "") as BigDecimal

assert allPrices.every { 
    def currentPrice = it.text().replace(/\D*/, "") as BigDecimal
    return currentPrice > price 
}

allPrices.every() вернет true, если все цены соответствуют данному предикату, и false в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...