比较两个数字作为字符串时抛出java.lang.ClassCastException:geb.content.TemplateDerivedPageContent

时间:2018-09-09 08:15:12

标签: groovy

我需要比较方法中一个父级的值数:

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 :(得分:0)

您必须知道

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

不会突变firstPriceValue。方法text()返回一个String表示形式,并且Strings是不可变的,因此在String上调用replace()会返回一个新值,并且不会更改您在其上调用该方法的String。要解决此问题,您必须从上述方法中捕获结果并将其分配给变量,例如:

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

另一件事是,将字符串与>进行比较无法按预期进行。看一下Groovy shell中的这个示例:

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