Search in sources :

Example 1 with ExternalResource

use of org.junit.rules.ExternalResource in project sandbox by irof.

the class JUnitWeldRunner method classRules.

@Override
protected List<TestRule> classRules() {
    List<TestRule> rules = super.classRules();
    rules.add(new ExternalResource() {

        private Weld weld;

        @Override
        protected void before() throws Throwable {
            // テストクラス(おそらく classes/test/java)
            deployBeansXML(klass);
            // テストクラスにインジェクションされるクラス(おそらく classes/main/java)
            for (Field field : klass.getDeclaredFields()) {
                if (!field.isAnnotationPresent(Inject.class)) {
                    continue;
                }
                field.setAccessible(true);
                deployBeansXML(field.getType());
                break;
            }
            weld = new Weld();
            container = weld.initialize();
        }

        /**
         * クラスのある場所にbeans.xmlがなかったら作成します。
         *
         * IDEAなどを使用している場合、beans.xmlとclassが別ディレクトリに配置されるため、
         * Weldは src/main/java や src/test/java のクラスを認識してくれないのです。
         *
         * @param clz Weldに認識させたいクラス
         * @throws URISyntaxException
         * @throws IOException
         */
        private void deployBeansXML(Class<?> clz) throws URISyntaxException, IOException {
            // WeldSEと同じ方法でリソースを読み込みます。
            WeldResourceLoader resourceLoader = new WeldResourceLoader();
            // "/META-INF/beans.xml" を指定するためにリソースのURIからパッケージを消す。
            // こんなコトしなくていい気がする。
            String name = clz.getName().replaceAll("\\.", File.separator);
            Path relativePath = Paths.get(name);
            Path absolutePath = Paths.get(resourceLoader.getResource(name + ".class").toURI());
            Path defaultPackage = Paths.get("/").resolve(absolutePath.subpath(0, absolutePath.getNameCount() - relativePath.getNameCount()));
            Path toPath = defaultPackage.resolve(WeldDeployment.BEANS_XML);
            // 既にあったらスルー
            if (toPath.toFile().exists())
                return;
            // 空ファイルを作る
            Files.createDirectories(toPath.getParent());
            Files.createFile(toPath);
        }

        @Override
        protected void after() {
            weld.shutdown();
        }
    });
    return rules;
}
Also used : Path(java.nio.file.Path) URISyntaxException(java.net.URISyntaxException) IOException(java.io.IOException) ExternalResource(org.junit.rules.ExternalResource) Weld(org.jboss.weld.environment.se.Weld) TestRule(org.junit.rules.TestRule) Field(java.lang.reflect.Field) WeldResourceLoader(org.jboss.weld.environment.deployment.WeldResourceLoader)

Aggregations

IOException (java.io.IOException)1 Field (java.lang.reflect.Field)1 URISyntaxException (java.net.URISyntaxException)1 Path (java.nio.file.Path)1 WeldResourceLoader (org.jboss.weld.environment.deployment.WeldResourceLoader)1 Weld (org.jboss.weld.environment.se.Weld)1 ExternalResource (org.junit.rules.ExternalResource)1 TestRule (org.junit.rules.TestRule)1