Spock测试打印功能的输出

时间:2017-11-20 15:51:37

标签: testing groovy stdout spock

我只是想知道如何测试一个执行某些东西打印的groovy函数的输出。所以我写的愚蠢的课程是:

class FriendlyGreeterLib {
    def greet(name) {
        println "${name.capitalize()}"
    }
}

如果greet()返回一个字符串,相应的测试将起作用。但是如何检查println到stdout ...

的输出
import spock.lang.Shared
import spock.lang.Specification

class FriendlyGreeterLibTest extends Specification{

    @Shared lib

    def setupSpec() {
        lib = new FriendlyGreeterLib()
    }

    def "FriendlyGreeterLib greets capitalized"() {
        expect:
        lib.greet(x) == y

        where:
        x | y
        'fred' | 'Fred'
        'FRED' | 'FRED'
        'fRED' | 'FRED'
    }
}

1 个答案:

答案 0 :(得分:4)

感谢Royg,我想到了为System.out设置不同的流并读出流缓冲区的想法。我不确定这是否绝对优雅,但它确实有效:

完成测试:

import spock.lang.Shared
import spock.lang.Specification

class FriendlyGreeterLibTest extends Specification{

    @Shared lib

    def setupSpec() {
        lib = new FriendlyGreeterLib()
    }

    def "FriendlyGreeterLib greets capitalized"() {
        when:
        def buffer = new ByteArrayOutputStream()
        System.out = new PrintStream(buffer)

        and:
        lib.greet(x)

        then:
        buffer.toString() == y

        where:
        x | y
        'fred' | 'Fred'
        'FRED' | 'FRED'
        'fRED' | 'FRED'
    }
}