簡體   English   中英

在Spock中運行測試時缺少MissingPropertyException

[英]MissingPropertyException while running test in spock

我有以下用groovy編寫的測試(使用spock框架時):

def "#checkPassword check if passwd match"() {
    given:
    def allowedPasswords = ["1", "2"]

    expect:
    myStrategy.checkPassword(myModel, input) == result

    where:
    input | result
    allowedPasswords   | true
}

但是,當我運行它時, allowedPasswords字段似乎丟失了。 我收到以下錯誤:

groovy.lang.MissingPropertyException: No such property: allowedPasswords for class: 

我不知道為什么,因為我在given部分中聲明了它。 你能幫我嗎?

就像您在尋找@Shared

import spock.lang.Shared
import spock.lang.Specification

class SpockTest extends Specification {
    @Shared allowedPasswords = ["1", "2"]

    def "#checkPassword check if passwd match"() {
        expect:
        checkPassword(input) == result

        where:
        input << allowedPasswords
        result << allowedPasswords
    }

    static String checkPassword(String input) {
        return input
    }
}

@Unroll問題的原因是where:塊在邏輯上屬於文本固定裝置-請記住,在@Unroll “ where”情況下,變量值甚至會編譯為方法名稱! 請參閱下面的示例代碼。 即, where:given:塊之前評估,因此您不能期望它知道在測試的稍后階段初始化的局部變量。

至於其余的測試代碼:如果沒有重復使用allowedPasswords ,我的建議是內聯它。 僅當您重復使用有問題的變量並且不想內聯兩次以簡化測試維護時,才可以使用您已經接受的答案或我將向您顯示的答案。 當然,德米特里的答案很好。 但是,如果不重新使用它,則會使測試代碼有些混亂,從而使其更難以閱讀和理解。 我建議您為提高可讀性而努力,因為良好的BDD測試是應用程序行為的規范,因此,Spock測試的基類名稱Specification和Geb基類名稱GebSpec

現在關於Dmitry的答案,我只想表明您可以使用良好的舊static方法代替@Shared ,並提供示例代碼並進行一些重用,從而使其更有意義,也更接近您自己的測試用例。 希望您以任何方式而不是他的方式接受此答案,因為他在我之前正確地回答了。 我只是在這里分享其他細節,沒有什么新鮮的。 在他的回答中,我只是缺少了為什么您的代碼不起作用的解釋,因此我也不得不回答。 :-)

package de.scrum_master.stackoverflow

import spock.lang.Specification
import spock.lang.Unroll

class AllowedPasswordsTest extends Specification {
  static allowedPasswords = ["1", "2"]

  @Unroll
  def "password check for '#input' should return #result"() {
    expect:
    checkPassword(input) == result

    where:
    input << allowedPasswords + ["3", "oops", "  ", null]
    result = input in allowedPasswords
  }

  static boolean checkPassword(String input) {
    return input?.trim()?.matches("[12]")
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM