Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * If a Bean is declared with @Autowired but has no bean with matching name, it gets mocked
- * used in conjunction with a limited base package performs auto generation of mocked dependencies
- */
- public class AutoBeanDeclarer implements BeanDefinitionRegistryPostProcessor {
- private final org.slf4j.Logger logger = LoggerFactory.getLogger(AutoBeanDeclarer.class);
- private final Collection<String> mockedDefinitions;
- public AutoBeanDeclarer() {
- mockedDefinitions = new ArrayList<String>();
- }
- private Iterable<Field> findAllAutoWired(Class targetBean) {
- List<Field> declaredFields = Arrays.asList(targetBean.getDeclaredFields());
- return Iterables.filter(declaredFields, new Predicate<Field>() {
- @Override
- public boolean apply(Field input) {
- return input.isAnnotationPresent(Autowired.class);
- }
- });
- }
- private void registerOn(final BeanDefinitionRegistry registry,final String beanName, final Class type){
- RootBeanDefinition definition = new RootBeanDefinition(MocksFactory.class);
- MutablePropertyValues values = new MutablePropertyValues();
- values.addPropertyValue(new PropertyValue("type", type));
- definition.setPropertyValues(values);
- logger.debug("bean registered with name : "+beanName);
- registry.registerBeanDefinition(beanName, definition);
- }
- @Override
- public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
- for(String beanName: registry.getBeanDefinitionNames()) {
- BeanDefinition beanDefinition = registry.getBeanDefinition(beanName);
- String beanClassName = beanDefinition.getBeanClassName();
- try {
- Class beanClass = Class.forName(beanClassName);
- for (final Field field : findAllAutoWired(beanClass)) {
- String fieldName = field.getName();
- boolean invalidType = field.getType().isArray() || field.getType().isPrimitive();
- if( invalidType ) {
- continue;
- }
- if( !registry.isBeanNameInUse(fieldName) ) {
- registerOn(registry, fieldName, field.getType());
- mockedDefinitions.add(fieldName);
- // Now field will be available for autowiring.
- }
- }
- } catch (ClassNotFoundException ex) {
- logger.error(ex.getMessage());
- }
- }
- }
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
- for(String beanName: mockedDefinitions) {
- if( !beanFactory.containsBean(beanName) ) {
- logger.error("Missing definition %s", beanName);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement