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

Spock-如何检查间谍对象上的方法调用计数?

淳于枫
2023-03-14
public class PlanConditionRepositoryImpl{

    ....

    public void write() {
        for (int i=0; i<3; i++) {
            createSP(new ConditionGroup(), new Condition()).call();
        }
    }

    protected StoredProcedure<Void> createSP(ConditionGroup planConditionGroup, Condition planCondition) {
        return new StoredProcedure<Void>()
                .jdbcTemplate(getJdbcTemplate())
                .schemaName(SCHEMA_NAME);
    }
}       
def write(){
    def repo = Spy(PlanConditionRepositoryImpl){
        createSP(_, _) >> Spy(StoredProcedure){
            call() >> {
                //do nothing
            }
        }
    }
    when:
    repo.write()

    then:
    3 * repo.createSP(_, _)
}
def "spec"() {
    given:
    def count = 0
    def spy = Spy(PlanConditionRepositoryImpl){
        createSP(_, _) >> {count++}
    }

    when:
    spy.write()

    then:
    count == 3
}

共有1个答案

鲁昕
2023-03-14

你需要的是一个部分模拟,看看文档。然而,正如我所说的,局部嘲讽基本上是糟糕的实践,可能表明一个糟糕的设计:

(在使用此特性之前要三思而后行。根据规范更改代码的设计可能会更好。)

关于部分嘲笑:

// this is now the object under specification, not a collaborator
def persister = Spy(MessagePersister) {
  // stub a call on the same object
  isPersistable(_) >> true
}

when:
persister.receive("msg")

then:
// demand a call on the same object
1 * persister.persist("msg")
@Grab('org.spockframework:spock-core:1.0-groovy-2.4')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*

class Test extends Specification {
    def "spec"() {
        given:    
        def mock = Mock(StoredProcedure)
        def spy = Spy(PlanConditionRepositoryImpl) 

        when:
        spy.write()

        then:
        3 * spy.createSP() >> mock
        3 * mock.run()
    }
}

class PlanConditionRepositoryImpl {

    void write() {
        for (int i = 0; i < 3; i++) {
            createSP().run()
        }
    }

    StoredProcedure createSP() {
        new StoredProcedure()    
    }
}

class StoredProcedure {
    def run() {}
}
 类似资料:
  • 问题内容: 我有内部类的课程,如下所示: 模仿测试如下所示:build.gradle: 测试: 第一次测试正在按预期方式工作。第二个永远不会被检测为“已调用”,尽管在日志中我看到的是。有什么问题吗?:) 谢谢! 问题答案: 怎么了? 好吧,这里的问题非常微妙,当您调用时,会在实例背后创建某种装饰器,以允许监视实例上的所有方法调用。因此,您可以检查给定方法被调用了多少次, 但是在装饰器 上 却 没有

  • 当我试图在单元测试中窥探一个对象时,我得到了一个异常。这是我的单元测试文件: 我在assign bookInfoParams Spy链接处遇到异常:

  • 所以我想做一些事情 但我得到了空异常

  • 问题内容: 我的模板看不到从Spring传递过来的对象。 我的代码: Contoller的代码: 主模板的代码: 片段的代码: 结果,我看到了方法调用的代码,例如 为什么thymeleaf不调用方法,而是在输出页上打印此文本?在http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html的示例中,方法调用具有相同的语法,例如 相同的代

  • 我正在为类编写一个单元测试,该类如下所示: 我想编写一个简单的单元测试,它将方法存根(这样它就不会实际触发并命中数据库),但它允许我验证调用是否最终执行。Mockito似乎是这份工作的合适工具。 这似乎是一个很好的游戏计划(至少对我来说)。但当我实际编写代码时,在测试方法的第2行(行)出现以下编译器错误: 类型Mockito中的(T)不适用于参数(void)时的方法 我看到Mockito无法模拟返

  • 问题内容: 我有以下控制器 ViewMeetingCtrl.js 我能够成功地为 cancelMeeting() 调用spyOn,但不能通过 sendCancelNotices 方法的调用来 实现 。我想要做的是,我想测试,只要 cancelMeeting() 被调用,它调用 sendCancelNotices() 方法。我知道我应该使用createSpy方法来执行此操作。但是我不确定该怎么做。