1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/* 2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors 3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License. 4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.configuration.injection.scanner; 6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.Captor; 8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.InjectMocks; 9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.Mock; 10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.MockitoAnnotations; 11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.Reporter; 12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.lang.reflect.Field; 14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.HashSet; 15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.Set; 16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/** 18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Scan field for injection. 19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson@SuppressWarnings("deprecation") 21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class InjectMocksScanner { 22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private final Class<?> clazz; 23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson /** 25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Create a new InjectMocksScanner for the given clazz on the given instance 26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * 27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @param clazz Current class in the hierarchy of the test 28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public InjectMocksScanner(Class<?> clazz) { 30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson this.clazz = clazz; 31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson /** 35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Add the fields annotated by @{@link InjectMocks} 36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * 37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @param mockDependentFields Set of fields annotated by @{@link InjectMocks} 38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public void addTo(Set<Field> mockDependentFields) { 40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson mockDependentFields.addAll(scan()); 41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson /** 44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Scan fields annotated by @InjectMocks 45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * 46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * @return Fields that depends on Mock 47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private Set<Field> scan() { 49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson Set<Field> mockDependentFields = new HashSet<Field>(); 50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson Field[] fields = clazz.getDeclaredFields(); 51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson for (Field field : fields) { 52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (null != field.getAnnotation(InjectMocks.class)) { 53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson assertNoAnnotations(field, Mock.class, MockitoAnnotations.Mock.class, Captor.class); 54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson mockDependentFields.add(field); 55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return mockDependentFields; 59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson void assertNoAnnotations(final Field field, final Class... annotations) { 62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson for (Class annotation : annotations) { 63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (field.isAnnotationPresent(annotation)) { 64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson new Reporter().unsupportedCombinationOfAnnotations(annotation.getSimpleName(), InjectMocks.class.getSimpleName()); 65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 69