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

Spock检验中参数约束的应用

江宏深
2023-03-14

我已经为一些Java类编写了Spock测试。当我试图验证参数中使用的确切对象时,测试失败了。

    def "all events are published to subscribers"() {
        given:
        EventSubscriber subscriber = Mock()
        when:
        subscriber.shouldRegister() >> true
        subscriber.interests() >> new HashSet<Intent>(Arrays.asList(COUNTER, GAUGE))
        publisher.subscribe(subscriber)
        def event = publisher.newEvent("test", COUNTER)
        event.start()
        def child = event.newChild("child", GAUGE)
        event.finish()
        then:
//        2 * subscriber.onCreate(event)
//        1 * subscriber.onStart(event, event.start)
//        1 * subscriber.onEnd(event, event.end)
//        1 * subscriber.onChild(event, child)
        2 * subscriber.onCreate(_)
        1 * subscriber.onStart(_, _)
        1 * subscriber.onEnd(_, _)
        1 * subscriber.onChild(_, _)
    }

注释掉的行以

Spock:1.3groovy:2.5groovy-test-junit5-2.5.7 JDK:11

共有1个答案

解柏
2023-03-14

交互测试中使用的对象实例应该在givid部分中定义。

这将是有效的:

def 'all events are published to subscribers'() {
    given:
    EventSubscriber subscriber = Mock()
    subscriber.shouldRegister() >> true
    subscriber.interests() >> new HashSet<Intent>(Arrays.asList(COUNTER, GAUGE))
    publisher.subscribe(subscriber)
    def event = publisher.newEvent('test', COUNTER)
    def child = event.newChild('child', GAUGE)

    when:
    event.start()
    event.finish()

    then:
    2 * subscriber.onCreate(event)
    1 * subscriber.onStart(event, event.start)
    1 * subscriber.onEnd(event, event.end)
    1 * subscriber.onChild(event, child)
}

但是,在测试调用oncreate()onchild()时会出现问题,因为这些调用不在when部分中,只有onstart()onend()可以匹配。

我没有您的类定义来查看详细信息,但我猜event.startevent.end字段是在start()finish()方法中初始化的,然后1*onStart(event,event.start)1*onEnd(event,event.end)test将不匹配,因为调用测试将在event具有不同的startend值的因此,只有1*onStart(event,_)1*onEnd(event,_)测试才会匹配。

请看这个简单的示例,它与您的情况相似,但不同之处在于事件实例是在给定部分中准备的,而不是在when中修改的,因此它将通过测试:

class InvocationWithArgumentsSpec extends Specification {
    void 'Invocation test works with arguments other then String'() {
        given:
        def subscriber = Mock(Subscriber)
        def simplePublisher = new Publisher()
        simplePublisher.subscribe(subscriber)
        def event = new SimpleEvent(name: 'test')

        when:
        simplePublisher.fireEvent(event)

        then:
        1 * subscriber.onEvent(event)
    }
}

interface Subscriber {
    void onEvent(SimpleEvent event)
}

class Publisher {
    Subscriber subscriber

    void subscribe(Subscriber subscriber) {
        this.subscriber = subscriber
    }

    void fireEvent(SimpleEvent event) {
        subscriber.onEvent(event)
    }
}

class SimpleEvent {
    String name
}

更新:但是有一个解决办法给你。它不是很好,但它可以工作,并测试正确的事件被传递到订阅服务器方法(我想event有类似name)的内容:

def 'all events are published to subscribers'() {
    given:
    EventSubscriber subscriber = Mock()
    subscriber.shouldRegister() >> true
    subscriber.interests() >> new HashSet<Intent>(Arrays.asList(COUNTER, GAUGE))
    publisher.subscribe(subscriber)

    when:
    def event = publisher.newEvent('test', COUNTER)
    event.start()
    event.newChild('child', GAUGE)
    event.finish()

    then:
    1 * subscriber.onCreate({ it.name == 'test' })
    1 * subscriber.onCreate({ it.name == 'child' })
    1 * subscriber.onStart({ it.name == 'test' }, !null)
    1 * subscriber.onEnd({ it.name == 'test' }, !null)
    1 * subscriber.onChild({ it.name == 'test' }, { it.name == 'child' })
}
 类似资料:
  • 每个人 因此,我有一个SpringBoot应用程序,它带有一个控制器,该控制器有几种方法,将以下POJO作为参数: 对于其中一个控制器endpoint,我想应用额外的验证逻辑,因此在我添加了以下内容: 是我想要应用的约束注释。 我的问题是,只有在中定义的检查成功通过时,才会调用此附加约束。如果为空,约束将被忽略,客户端将收到不完整的验证结果。我错过了什么?

  • 我有一系列复杂的类型级别函数,它们的计算结果如下: 显然,在这种情况下,这个表达式是一个。更一般地说,我们可以说: 有没有办法教GHC推断这一点? 编辑:@chi指出,在某些情况下,GADT可以解决这一问题,但我的特殊情况是: 然后 不能被访问,但是也许GHC应该能够推断出

  • 假设我有一个类模板,

  • 我希望对spring服务的参数使用java bean验证注释。考虑以下服务:

  • 主要内容:选取设置检查约束的字段,在创建表时设置检查约束,在修改表时添加检查约束,删除检查约束MySQL检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。 在《MySQL默认值》和《MySQL非空约束》中讲解的默认值约束和非空约束也可看作是特殊的检查约束。 选取设置检查约束的字段 检查约束使用 CHECK 关键字,具体的语法格式如下: C

  • 主要内容:Oracle Check约束简介在本教程中,您将学习如何使用Oracle检查约束来强制域(列)的完整性。 Oracle Check约束简介 Oracle检查约束允许通过限制一列或多列所接受的值来强制执行域完整性。 要创建一个检查约束,可以定义一个返回或的逻辑表达式。 Oracle使用此表达式来验证正在插入或更新的数据。 如果表达式的计算结果为,则Oracle接受数据并进行插入或更新。 否则,Oracle将拒绝这些数据,新数据根本