加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

groovy – 有没有办法防止Geb从void方法返回null?

发布时间:2020-12-14 16:25:21 所属栏目:大数据 来源:网络整理
导读:在Spock规范中任何期望的行:或者然后:block被评估并断言为boolean,除非它具有返回类型为void的签名. 我注意到在从Navigator继承的任何类(例如Page或Module类)上声明为void的方法有些奇怪. 假设我们有这样的例子: class NavigationSpec extends GebSpec {
在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可能没有机会检查你正在调用的方法的签名,所以它正确地假定它必须断言结果……至少那是它的样子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读