Java Gradle:如何测试自定义任务输出(println)

Java Gradle:如何测试自定义任务输出(println),java,gradle,Java,Gradle,如何测试定制Gradle任务的println输出?这是我目前的代码: class TaskTest { @Test void testSomething() { Project project = ProjectBuilder.builder().build() def task = project.task('testTask', type: Task) task.execute() <<assert

如何测试定制Gradle任务的
println
输出?这是我目前的代码:

class TaskTest {
    @Test
    void testSomething() {
        Project project = ProjectBuilder.builder().build()
        def task = project.task('testTask', type: Task)
        task.execute()
        <<assert task did println "Hello, world!">>
    }
}
类任务测试{
@试验
void testSomething(){
Project=ProjectBuilder.builder().build()
def task=project.task('testTask',类型:task)
task.execute()
}
}

解决方案是用实现替换标准输出流,然后从中读取数据。您也可以对错误结束输入流执行此操作

def stdout = System.out
def os = new ByteArrayOutputStream()

System.out = new PrintStream(os)
println 'Hello World!' // implicit flush

def array = os.toByteArray()
def is = new ByteArrayInputStream(array)
System.out = stdout

def line = is.readLines()[0]
assert line == 'Hello World!'
您可以使用以下命令执行此操作:

import groovy.ui.SystemOutputInterceptor

class TaskTest {
    @Test
    void testSomething() {
        def expected = 'expectedOutput'
        def actual ='';
        def interceptor = new SystemOutputInterceptor({ actual += it; false});

        Project project = ProjectBuilder.builder().build()
        def task = project.task('testTask', type: Task)

        interceptor.start()
        task.execute()
        interceptor.stop()

        assert actual.trim() == expected
    }
}
编辑: 如果您想用于您的,您也可以这样测试:

class TaskTest extends spock.lang.Specification {
  def "should print test to stdout"() {
    given:
    def expected = 'expectedOutput'
    System.out = Mock(PrintStream)
    Project project = ProjectBuilder.builder().build()
    def task = project.task('testTask', type: Task)

    when:
    task.execute()

    then:
    1 * System.out.println(expected)
  }
}
在Java中模拟
System.out
应该可以使用