打印功能的Spock测试输出

fer*_*rdy 2 testing groovy stdout spock

我只是想知道我如何测试执行某些内容的print的groovy函数的输出。所以我写的愚蠢类是:

class FriendlyGreeterLib {
    def greet(name) {
        println "${name.capitalize()}"
    }
}
Run Code Online (Sandbox Code Playgroud)

如果greet()返回字符串,则相应的测试将起作用。但是如何检查printlnto 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'
    }
}
Run Code Online (Sandbox Code Playgroud)

fer*_*rdy 5

感谢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'
    }
}
Run Code Online (Sandbox Code Playgroud)