@Override
    protected void runChild(final TestInfo testInfo, RunNotifier notifier) {

        log("-----------------------------------------------------------");
        log("Starting Test [{0} / {1}]", testInfo.plan.name, testInfo.name);
        log("-----------------------------------------------------------");

        Description description = describeChild(testInfo);
        if (testInfo instanceof GatewayAssertionTestInfo) {
            runLeaf(new Statement() {
                @Override
                public void evaluate() throws Throwable {
                    String actualGatewayLog = MockGatewayServlet.getRequestLog();
                    Assert.assertEquals(((GatewayAssertionTestInfo) testInfo).expectedLog, actualGatewayLog);
                }
            }, description, notifier);
        } else if (testInfo instanceof PublishPayloadTestInfo) {
            runLeaf(new Statement() {
                @Override
                public void evaluate() throws Throwable {
                    String[] expectedPayloads = ((PublishPayloadTestInfo) testInfo).expectedPayloads;
                    int index = 0;
                    for (String expectedPayload : expectedPayloads) {
                        if (MockGatewayServlet.getPayloads().isEmpty()) {
                            Assert.fail("Expected a payload but did not find one.");
                        }
                        String actualPayload = MockGatewayServlet.getPayloads().get(index);
                        if (expectedPayload == null || "".equals(expectedPayload)) {
                            Assert.assertNull(actualPayload);
                        } else {
                            ObjectMapper mapper = new ObjectMapper();
                            JsonNode expected = mapper.readTree(expectedPayload);
                            JsonNode actual = mapper.readTree(actualPayload.trim());
                            JsonCompare jsonCompare = new JsonCompare();
                            jsonCompare.assertJson(expected, actual);
                        }

                        index++;
                    }
                }
            }, description, notifier);
        } else {
            runLeaf(new Statement() {
                @Override
                public void evaluate() throws Throwable {
                    if (skipCurrentStorage(testInfo)){

                        log("-----------------------------------------------------------");
                        log("Skipping Test [{0} / {1} for storage {2}]", testInfo.plan.name, testInfo.name, ManagerTestUtils.getTestType().toString());
                        log("-----------------------------------------------------------");

                    } else {

                        String rtPath = testInfo.test.getValue();
                        Integer delay = testInfo.test.getDelay();

                        if (delay != null) {
                            try { Thread.sleep(delay); } catch (InterruptedException e) { }
                        }
                        if (rtPath != null && !rtPath.trim().isEmpty()) {
                            RestTest restTest = TestUtil.loadRestTest(rtPath, getTestClass().getJavaClass().getClassLoader());
                            String endpoint = testInfo.plan.endpoint;
                            if (StringUtils.isEmpty(endpoint)) {
                                endpoint = TestUtil.doPropertyReplacement(testInfo.test.getEndpoint());
                            }
                            if (StringUtils.isEmpty(endpoint)) {
                                endpoint = TestUtil.doPropertyReplacement(testInfo.group.getEndpoint());
                            }
                            if (StringUtils.isEmpty(endpoint)) {
                                endpoint = TestUtil.doPropertyReplacement(testInfo.plan.plan.getEndpoint());
                            }
                            if (StringUtils.isEmpty(endpoint)) {
                                endpoint = "http://localhost:" + getTestServerPort() + getBaseApiContext();
                            }
                            runWithRetries(testInfo, endpoint);
                        }
                    }

                }
            }, description, notifier);
        }
    }
@see org.junit.runners.ParentRunner#runChild(java.lang.Object, org.junit.runner.notification.RunNotifier)
manager/test/api/src/main/java/io/apiman/manager/test/junit/ManagerRestTester.java