代码之家  ›  专栏  ›  技术社区  ›  Piotr Pradzynski

如何验证是否使用spock中的指定元素集调用方法?

  •  0
  • Piotr Pradzynski  · 技术社区  · 6 年前

    我在斯波克有个测试:

    def repository= Mock(Repository)
    
    @Subject
    def service = new Service(repository)
    
    def "test"() {
      given:
      def results = [ /* does not matter */ ]
    
      def element = XYZ
    
      when:
      def found = service.findByElement(element)
    
      then:
      1 * repository.findByElements(_ as Set) >> results 
    }
    

    工作正常。但我想核实一下 repository.findByElements 方法是使用一个元素集和我们的特定元素。如何做到这一点?

    这两者都不是:

    1 * repository.findByElements([element] as Set) >> results
    

    也不是这样:

    1 * repository.findByElements({ assert it == [element] as Set }) >> results
    

    不工作。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Szymon Stepniak    6 年前

    你可以用 an argument constraint 它需要一个表示谓词的闭包。它看起来类似于您的第二个用例——唯一的区别是没有 assert 需要关键字(谓词必须返回布尔值)。变量 it 保留模拟方法在被调用时检索的参数值,以便可以基于传递的值创建谓词。

    def repository= Mock(Repository)
    
    @Subject
    def service = new Service(repository)
    
    def "test"() {
        given:
        def results = [ /* does not matter */ ]
    
        def element = new Element("XYZ")
    
        when:
        def found = service.findByElement(element)
    
        then:
        1 * repository.findByElements({ it == [element] as Set }) >> results
    }