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()); if (outputEvent.getMessage().contains("LEAK:")) { println stdout println stderr throw new RuntimeException("Netty ResourceLeakDetector"); } } } }