unit-testing - 如何使用 Spock 模拟有效地模拟流畅的界面?

标签 unit-testing groovy spock

我想用mock来模拟一些流畅的界面,它基本上是一个邮件生成器:

this.builder()
            .from(from)
            .to(to)
            .cc(cc)
            .bcc(bcc)
            .template(templateId, templateParameter)
            .send();

当用 Spock 模拟这个时,这需要很多这样的设置:
def builder = Mock(Builder)
builder.from(_) >> builder
builder.to(_) >> builder 

等等。当您想测试与模拟的某些交互时,它会变得更加麻烦,具体取决于用例。所以我在这里基本上有两个问题:
  • 有没有一种方法可以组合模拟规则,以便我可以在一个可以在每个测试用例上重用的方法中对流利的接口(interface)进行一次通用的一次性设置,然后为每个测试用例指定额外的规则?
  • 有没有办法用更少的代码来指定一个流畅的接口(interface)的模拟,例如就像是:

    def builder = Mock(Builder)
    builder./(from|to|cc|bcc|template)/(*) >> builder

    或等同于 Mockito 的 Deep Stubs(见 http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#RETURNS_DEEP_STUBS )
  • 最佳答案

    你可以这样做:

    def "stubbing and mocking a builder"() {
        def builder = Mock(Builder)
        // could also put this into a setup method
        builder./from|to|cc|bcc|template|send/(*_) >> builder
    
        when:
        // exercise code that uses builder
    
        then:
        // interactions in then-block override any other interactions
        // note that you have to repeat the stubbing
        1 * builder.to("fred") >> builder
    }
    

    关于unit-testing - 如何使用 Spock 模拟有效地模拟流畅的界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16772600/

    相关文章:

    grails - 如何在Grails 2.4.5中模拟具有复合ID的对象?

    java - 如何在不实现 stub 类的情况下使用 Mockito 为接口(interface)生成 spy ?

    c# - 如何在测试方法中模拟按键?

    Android Espresso 测试套件

    具有严格版本和因为关键字的 Gradle 6 依赖项

    grails - 如何使用 apache POI 逐行遍历 .docx 文件

    unit-testing - Grails升级2.2-> 2.3.7后,Spock测试失败

    ruby-on-rails - 如何让 Rubymine 与 minitest 框架一起工作

    grails - 尝试获取ID类型不匹配

    groovy - Spock:模拟类方法不匹配