groovy – 有没有办法防止Geb从void方法返回null?
在Spock规范中任何期望的行:或者然后:block被评估并断言为boolean,除非它具有返回类型为void的签名.
我注意到在从Navigator继承的任何类(例如Page或Module类)上声明为void的方法有些奇怪. 假设我们有这样的例子: class NavigationSpec extends GebSpec { def 'Collections page has a right header'() { when: to CollectionsPage then: hasHeaderText('Collections') } } hasHeaderText()方法在CollectionsPage类中定义,如下所示: class CollectionsPage extends Page { static url = 'movies/collections' void hasHeaderText(String expectedText) { assert true } } 故意,我只是在那里断言,所以它永远不会失败.即使它失败并出现错误: Condition not satisfied: hasHeaderText('Collections') | null void方法调用结果的方式和原因被评估为null? 我知道如何“修复它”.将方法返回类型声明为boolean并返回true就足够了.这是丑陋的,但是跟随所有断言,否则必须添加不必要的返回true,如: boolean hasHeaderText(String expectedText) { assert header.text() == expectedText return true } 这只会产生噪音.有没有办法阻止Geb从void方法返回null? 当然,我知道这个具体案例可能是这样的: boolean hasHeaderText(String expectedText) { header.text() == expectedText` } 这并不能解释丢失的void返回类型的奇怪之处,更不用说我们用这种方法松散有意义的断言失败消息. 解决方法
每个方法都返回一个值,这是Groovy语言的一部分.这允许任何方法在表达式中使用或作为lambdas使用.
声明为void的所有方法都返回null. 如果没有显式地有任何return语句,则返回方法中最后一个表达式的结果. 您可以查看字节码…即使您声明了返回类型,您实际上也不需要返回任何内容,因为Groovy默认情况下会返回null: // returns null String callMe() { } static void main(args) { def x = callMe() assert x == null println "OK!" } 因为Spock会在then块中断言任何不是简单赋值的东西,所以你需要避免在then块中做除布尔断言之外的任何事情.应该避免分配变量,尽管允许,但是很难保持测试的清洁和清晰,从长远来看,坚持这些准则对你来说真的很有用,而不是对你不利. 因此,编写所需断言的正确方法是使方法返回一个布尔值: boolean hasHeaderText(String expectedText) { header.text() == expectedText } 并在then块中使用它: then: 'The header has the expected text #expectedText' hasHeaderText expectedText 如果你问我,看起来很不错. 编辑 我注意到Groovy / Spock实际上不会断言正常的void方法的结果,即使在那个块中…这里可能发生的是你没有正常的void方法,你似乎在调用一个CollectionsPage的动态方法(我猜这是Geb的魔法),这意味着Spock AST Transformer可能没有机会检查你正在调用的方法的签名,所以它正确地假定它必须断言结果……至少那是它的样子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |