/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.test.cdi;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import org.junit.rules.TestRule;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
public class CamelCdiRunner extends BlockJUnit4ClassRunner {
private final CamelCdiContext context = new CamelCdiContext();
public CamelCdiRunner(Class<?> clazz) throws InitializationError {
super(clazz);
}
@Override
protected void validateConstructor(List<Throwable> errors) {
// The test class is instantiated as a CDI bean so we bypass the
// default JUnit test class constructor constraints validation.
}
@Override
protected void validatePublicVoidNoArgMethods(Class<? extends Annotation> annotation, boolean isStatic, List<Throwable> errors) {
// Overrides the default validation to allow test methods with
// parameters so that we can inject CDI references.
List<FrameworkMethod> methods = getTestClass().getAnnotatedMethods(annotation);
for (FrameworkMethod eachTestMethod : methods) {
eachTestMethod.validatePublicVoid(isStatic, errors);
}
}
@Override
protected List<FrameworkMethod> getChildren() {
List<FrameworkMethod> children = super.getChildren();
boolean hasDefinedOrder = false;
for (FrameworkMethod method : children) {
if (method.getAnnotation(Order.class) != null) {
hasDefinedOrder = true;
}
}
if (hasDefinedOrder) {
List<FrameworkMethod> sorted = new ArrayList<>(children);
Collections.sort(sorted, new FrameworkMethodSorter());
return sorted;
}
return children;
}
@Override
protected List<TestRule> classRules() {
List<TestRule> rules = super.classRules();
// Add the CDI container rule before all the other class rules
// so that it's the last one in FIFO
rules.add(0, new CamelCdiDeployment(getTestClass(), context));
return rules;
}
@Override
protected Object createTest() {
BeanManager manager = context.getBeanManager();
Set<Bean<?>> beans = manager.getBeans(getTestClass().getJavaClass(), AnyLiteral.INSTANCE);
Bean<?> bean = beans.iterator().next();
// TODO: manage lifecycle of @Dependent beans
return manager.getReference(bean, bean.getBeanClass(), manager.createCreationalContext(bean));
}
@Override
protected Statement methodInvoker(FrameworkMethod method, Object test) {
return new FrameworkMethodCdiInjection(method, test, context);
}
}