package kr.debop4j.data.ogm.test.utils; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.rules.TemporaryFolder; import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; /** * test case useful when one want to write a test relying on an archive (like a JPA archive) * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 13. 4. 12. 오후 1:34 */ public class PackagingRule extends TemporaryFolder { private static final ArchivePath persistencePath = ArchivePaths.create("persistence.xml"); protected static ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); private final JavaArchive archive; private final File testPackage; public PackagingRule(String persistenceConfResource, Class<?>... entities) { archive = ShrinkWrap.create(JavaArchive.class, "jtastandalone.jar"); archive.addClasses(entities); archive.addAsManifestResource(persistenceConfResource, persistencePath); try { create(); testPackage = newFile(); } catch (IOException e) { throw new RuntimeException(e); } archive.as(ZipExporter.class).exportTo(testPackage, true); } @Override public void before() throws Throwable { super.before(); URLClassLoader classLoader = new URLClassLoader(new URL[] { testPackage.toURL() }, originalClassLoader); Thread.currentThread().setContextClassLoader(classLoader); } @Override protected void after() { // reset the classloader Thread.currentThread().setContextClassLoader(originalClassLoader); super.after(); } }