test { def outputReporter = new OutputReporter() addTestListener(outputReporter) addTestOutputListener(outputReporter) } class OutputReporter implements TestListener, TestOutputListener { private StringBuilder stdout = new StringBuilder() private StringBuilder stderr = new StringBuilder() @Override void beforeSuite(TestDescriptor suite) { } @Override void afterSuite(TestDescriptor suite, TestResult result) { } @Override void beforeTest(TestDescriptor testDescriptor) { if (!testDescriptor.isComposite()) { stdout.setLength(0) stderr.setLength(0) } } @Override void afterTest(TestDescriptor testDescriptor, TestResult result) { if (!testDescriptor.isComposite() && result.getResultType() == TestResult.ResultType.FAILURE) { if (stdout.length() != 0) { println "" println "--- STDOUT ---" print stdout println "--- STDOUT ---" } if (stderr.length() != 0) { println "" println "--- STDERR ---" println stderr println "--- STDERR ---" } } } @Override void onOutput(TestDescriptor testDescriptor, TestOutputEvent outputEvent) { if (!testDescriptor.isComposite()) { def buffer = (outputEvent.getDestination() == TestOutputEvent.Destination.StdOut) ? stdout : stderr buffer.append(outputEvent.getMessage()) // TODO re-enable this // if (outputEvent.getMessage().contains("LEAK:")) { // println stdout // println stderr // throw new RuntimeException("Netty ResourceLeakDetector") // } } } }