package samples.testng.bugs.github647; import org.testng.IResultMap; import org.testng.TestListenerAdapter; import org.testng.TestNG; import org.testng.annotations.Test; import org.testng.xml.XmlSuite; import samples.testng.SimpleBaseTest; import java.net.URL; import java.net.URLClassLoader; import static org.testng.Assert.assertEquals; public class GitHub647 extends SimpleBaseTest { private final TestListenerAdapter tla; public GitHub647() { tla = new TestListenerAdapter(); } @Test public void testSkipTest() throws Exception { final TestNG tng = createTestNG(); runTest(tng); assertOneTestSkipped(); } private TestNG createTestNG() { final TestNG tng = create(SkipExceptionTest.class); tng.setThreadCount(1); tng.setParallel(XmlSuite.ParallelMode.NONE); tng.setPreserveOrder(true); tng.addListener(tla); return tng; } private void assertOneTestSkipped() { IResultMap skippedTests = tla.getTestContexts().get(0).getSkippedTests(); assertEquals(1, skippedTests.size()); } private void runTest(TestNG tng) { ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader(); ClassLoader classLoader = new SimpleClassLoader(currentClassLoader); Thread.currentThread().setContextClassLoader(classLoader); tng.run(); Thread.currentThread().setContextClassLoader(currentClassLoader); } public static final class SimpleClassLoader extends ClassLoader { private final ClassLoader currentClassLoader; private final URLClassLoader delegate; public SimpleClassLoader(ClassLoader currentClassLoader) { this.currentClassLoader = currentClassLoader; this.delegate = new URLClassLoader(new URL[]{currentClassLoader.getResource("")}, null); } @Override protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { final Class<?> clazz; if (shouldBeLoadedWithDelegate(name)) { clazz = delegate.loadClass(name); } else { clazz = currentClassLoader.loadClass(name); } if (resolve) { resolveClass(clazz); } return clazz; } private boolean shouldBeLoadedWithDelegate(String name) { return "org.testng.SkipException".equals(name) || "test.testng1003.SkipExceptionTest".equals(name) || "test.testng1003.SomeClass".equals(name); } } }