打印功能的 Spock 测试输出

Spock testing output from printing function

我只是想知道如何测试 groovy 函数的输出,该函数执行一些内容的 println。所以我写的傻class是:

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

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

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'
    }
}

感谢 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'
    }
}