[英]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.