Spock:我如何获得失败测试的上下文?

时间:2014-10-13 17:33:51

标签: java unit-testing groovy spock

def "validate my files list"() {
    when:
    new File(folder).eachFileRecurse {
        validateFile(it)
    }
    then:
    notThrown(ValidationFailedException)
    where:
    folder << ['folder1', 'folder2']
}

我用Spock和Groovy编写了这个简单的测试。 当它失败时打印:

  

异常本身(...)

     

预计类型&#39; ValidationFailedException&#39;成为   扔了,但还是得到了

我想知道如何打印fileName和folder1 / folder2参数以了解错误数据的位置? 我看到的唯一方法是使用包含fileName和folderName的消息创建Exception,并在阻止时重新抛出它,但这不是很方便。

3 个答案:

答案 0 :(得分:2)

@Unroll
def "validate #folder"() { ... }

答案 1 :(得分:1)

我认为这里没有好的解决方案。

notThrown方法不返回任何带有附加信息的结果,在我看来,这不是设计不良的情况,因为此方法的目的是验证规范的结果,而不会有任何进一步的操作。

老实说,我认为在异常中添加详细消息是最好的主意。如果没有此消息,抛出的异常似乎毫无意义。通过一些细节您可以轻松确定不仅在测试内部而且在实际系统中发生的事情。

您还可以在println关闭内添加eachFileRecurse语句。但这显然是一个坏主意。

答案 2 :(得分:1)

如果您需要fileName,则需要解决方法,但我不认为下面的测试会增加价值。我宁愿确保validateFile()承担递归验证每个文件的逻辑。因此,@彼得的方法应该足够了。无论如何,这里只是为了测试而无法有效地打印fileName

import spock.lang.*

@Unroll
class SampleSpec extends Specification {
    @Shared filesUnderFolder1, filesUnderFolder2

    void setupSpec() {
        filesUnderFolder1 = []
        filesUnderFolder2 = []

        new File('folder1').eachFileRecurse {
            filesUnderFolder1 << it
        }
        new File('folder2').eachFileRecurse {
            filesUnderFolder2 << it
        }
    }

    void "test validate file #filesUnderTest under folder1"() {
        when:
        validateFile(filesUnderTest)

        then:
        notThrown(Exception)

        where:
        filesUnderTest << filesUnderFolder1
    }

    void "test validate file #filesUnderTest under folder2"() {
        when:
        validateFile(filesUnderTest)

        then:
        thrown(Exception)

        where:
        filesUnderTest << filesUnderFolder2
    }

    // Mimic validateFile method call
    private validateFile(File file) {
        if ( !file.name.startsWith( 'a' ) ) {
            throw new Exception()
        }
    }
}