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;
}
Aggregations