package org.test4j.module.spring.strategy.injector; import static org.test4j.tools.commons.AnnotationHelper.getFieldsAnnotatedWith; import java.lang.reflect.Field; import java.util.Set; import javax.annotation.Resource; import org.test4j.module.Test4JException; import org.test4j.module.spring.annotations.SpringContext; import org.test4j.module.spring.strategy.Test4JBeanFactory; import org.test4j.tools.commons.FieldHelper; import org.test4j.tools.commons.StringHelper; @SuppressWarnings({ "unchecked", "rawtypes" }) class SpringBeanInjectorByResource extends SpringBeanInjector { /** * {@inheritDoc}<br> * <br> * 根据@SpringBeanByName注入spring bean<br> * <br> * Gets the spring bean with the given name. The given test instance, by * using {@link SpringContext}, determines the application context in which * to look for the bean. * <p/> * A Test4JException is thrown when the no bean could be found for the given * name. */ @Override public void injectBy(Test4JBeanFactory beanFactory, Object testedObject) { Class testedClazz = testedObject.getClass(); Set<Field> fields = getFieldsAnnotatedWith(testedClazz, Resource.class); for (Field field : fields) { try { Resource byResource = field.getAnnotation(Resource.class); String beanName = byResource.name(); if (StringHelper.isBlankOrNull(byResource.name())) { beanName = field.getName(); } Object bean = beanFactory.getSpringBean(beanName); FieldHelper.setFieldValue(testedObject, field, bean); } catch (Throwable e) { String error = String.format("inject @SpringBeanByName field[%s] in class[%s] error.", field.getName(), testedClazz.getName()); throw new Test4JException(error, e); } } } }