代码之家  ›  专栏  ›  技术社区  ›  ratzip

用spock检验空隙率的简易方法

  •  0
  • ratzip  · 技术社区  · 7 年前

    我有以下方法需要测试:

    class Person {
    
        String getFileName(String number) {
             return "file"+number
        }
    
        void updateSpec(String number) {
             new File(getFileName(number)).delete()
        }
    }
    

    我试图创建这样的测试用例:

    def "update spec"() {
            given:
                Person person = new Person()
    
            when:
                person.updateSpec('1')
    
            then:
                1 * File.delete()
        }
    

    它说:

    Too few invocations for:
    
    1 * File.delete()   (0 invocations)
    

    有什么问题,怎么解决,谢谢!

    有没有好的方法来测试这种方法?

    0 回复  |  直到 7 年前
        1
  •  1
  •   cgrim    7 年前

    取决于你想测试什么。首先,必须使用mock或spy才能测试调用计数。

    例如,您可以测试 getFileName() 方法是从 updateSpec() 方法,如果它是用 '1' 这样的争论:

    def "update spec"() {
        given:
        Person person = Spy(Person)
    
        when:
        person.updateSpec('1')
    
        then:
        1 * person.getFileName('1')
    }
    

    如果你真的需要测试 File.delete() 打过电话,最好换个 Person 上课一点,因为你需要 File 可以检查调用计数的模拟:

    class Person {
        File getFile(String number) {
            return new File("file" + number)
        }
    
        void updateSpec(String number) {
            getFile(number).delete()
        }
    }
    

    测试可以是:

    def "File delete was called"() {
        given:
        File file = Mock(File)
        Person person = Spy(Person)
        person.getFile(_) >> file
    
        when:
        person.updateSpec('1')
    
        then:
        1 * file.delete()
    }
    

    另一个选择是注入一些 FileService ,wich将封装 文件.删除() 方法,进入 对其进行类和测试。

        2
  •  1
  •   Dmitry Khamitov    7 年前

    只能定义规范下的对象与其模拟依赖项之间的交互。然而,在您的示例中,您正在“指定”与 File 类,而不是模拟对象。见斯波克 Interaction Based Testing . 从技术上讲,您可以按照@cgrim answer中的建议实现/更改您的目标。或者您可以使用powermock(w/o spock)之类的工具来模拟几乎所有的东西,但是请记住,这种技术只能作为最后的手段。基本上,如果你坚持最佳设计实践,那么你将永远不需要这样的工具。除非你必须处理一些遗留代码