/**
* junit-rules: JUnit Rules Library
*
* Copyright (c) 2009-2011 by Alistair A. Israel.
* This software is made available under the terms of the MIT License.
*
* Created Feb 15, 2011
*/
package junit.rules.cdi;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionTarget;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Provides a CDI (JSR-299) test environment using JBoss Weld.
*
* @author Alistair A. Israel
*/
@SuppressWarnings("deprecation")
public class Weld implements MethodRule {
private static final Logger logger = LoggerFactory.getLogger(Weld.class);
private final org.jboss.weld.environment.se.Weld weld;
private WeldContainer weldContainer;
/**
*
*/
public Weld() {
logger.trace("Weld()");
weld = new org.jboss.weld.environment.se.Weld();
weldContainer = weld.initialize();
}
/**
* {@inheritDoc}
*
* @see org.junit.rules.MethodRule#apply(org.junit.runners.model.Statement,
* org.junit.runners.model.FrameworkMethod, java.lang.Object)
*/
@Override
public final Statement apply(final Statement base, final FrameworkMethod method,
final Object target) {
logger.trace("apply({}.{})", method.getMethod().getDeclaringClass().getCanonicalName(),
method.getName());
final BeanManager bm = weldContainer.getBeanManager();
final Class<?> cl = target.getClass();
@SuppressWarnings("unchecked")
final AnnotatedType<Object> at = (AnnotatedType<Object>) bm.createAnnotatedType(cl);
final InjectionTarget<Object> it = bm.createInjectionTarget(at);
return new Statement() {
@Override
public void evaluate() throws Throwable {
// before
final CreationalContext<Object> cc = bm.createCreationalContext(null);
it.inject(target, cc);
// yield
base.evaluate();
// after
weld.shutdown();
}
};
}
}