当前位置: 首页 > 知识库问答 >
问题:

在spock中运行测试时缺少PropertyException

高运诚
2023-03-14

我用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一节中声明了它。你能帮我吗?

共有2个答案

云丰
2023-03-14

你的问题的原因是其中:块逻辑上属于文本夹具-记住,在@Unroll的情况下,变量值甚至会被编译成方法名!请参阅下面的示例代码。即,,其中:在给定的块之前计算,因此您不能期望它知道稍后在测试期间初始化的局部变量。

至于测试代码的其余部分:如果没有重用allowePassword,我的建议是只内联它。您已经接受的答案或我将向您展示的作为替代选项的答案只有在您重新使用所讨论的变量并且不想为了使测试维护更容易而将其内联两次时才会使用。那么德米特里的答案当然是好的。然而,如果不重用,它会稍微混淆测试代码,使其更难阅读和理解。我建议您努力实现可读性,因为一个好的BDD测试是应用程序行为的规范,因此Spock测试基类名称规范和Geb基类名称GebSpec

至于Dmitry的回答,我只想说明,您可以使用好的旧静态作为@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]")
  }
}

陆翔飞
2023-03-14

看起来就像你在寻找@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
    }
}
 类似资料:
  • 我有一个简单的类,它基于一个简单的规则构建一个。 如果在数据库中找到,则使用该元数据生成消息 这是这门课和一个斯波克测试。测试失败时,出现,表示无法找到使用该服务创建的。 我真的很想理解为什么这不起作用。我非常感谢在成功测试这项测试中得到的任何帮助。非常感谢。

  • 我在单元测试中使用了H2数据库,使用java配置:

  • 我正在为Junit编写测试,以测试我编写的删除函数: 此方法适用于同时具有前后节点的双链接列表。 问题是:我们的大学将针对我们编写的测试运行错误代码,以确定我们是否编写了足够的测试来捕获错误代码和异常。 我知道他们将运行的两个测试,但不知道错误的含义。 > 失败:缺少逻辑 故障:缺少NextNodeRepairLogic 这是我没有考虑的两个测试,因为我无法理解这些错误的含义。有人知道这些错误可能

  • Spock规范如下所示: 是一个测试记录列表,对于该列表的每个成员,方法将按顺序运行。我想要的是,列表的前k个成员运行一个线程,下面的k个成员在第二个线程中运行,等等...理论上,使用Executors框架和类(因为Spock依赖于JUnit),这可以相对容易地完成。 然而,问题是如何将更小的注入到具有方法的类中,因为Spock不允许构造函数,而JUnitCore需要类名(具有测试/规范的类),而

  • 下面是源代码和测试代码,有人能让我知道我做错了什么吗?似乎根本没有调用dao mock并返回“USA”。我在网上做了一些研究,找不到我做错了什么。 下面是我的Spock测试代码:

  • 我得堆栈: 想法2019.1.3 Springboot 2.1.6 Java 11 Maven 3.8.0 Groovy 2.5 史巴克1.3 JUnit jupiter 5.5.1 JUnit vintage 5.5.1 GMavenPlus插件2.7.1 我们想开始在Spock测试框架中编写测试。我跟着这个howto,但没有成功。当我尝试运行所有测试时,我的spock测试没有运行。 我能运行一