我需要比较方法中一个父级的值数:
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
能否请您帮助我了解该方法的问题以及如何解决?
答案 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
。