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.filter; 6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.Reporter; 8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.util.reflection.BeanPropertySetter; 9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.util.reflection.FieldSetter; 10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.lang.reflect.Field; 12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.Collection; 13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/** 15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This node returns an actual injecter which will be either : 16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * 17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <ul> 18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>an {@link OngoingInjecter} that do nothing if a candidate couldn't be found</li> 19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>an {@link OngoingInjecter} that will try to inject the candidate trying first the property setter then if not possible try the field access</li> 20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </ul> 21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class FinalMockCandidateFilter implements MockCandidateFilter { 23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public OngoingInjecter filterCandidate(final Collection<Object> mocks, final Field field, final Object fieldInstance) { 24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if(mocks.size() == 1) { 25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson final Object matchingMock = mocks.iterator().next(); 26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return new OngoingInjecter() { 28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public Object thenInject() { 29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson try { 30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson if (!new BeanPropertySetter(fieldInstance, field).set(matchingMock)) { 31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson new FieldSetter(fieldInstance, field).set(matchingMock); 32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } catch (RuntimeException e) { 34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson new Reporter().cannotInjectDependency(field, matchingMock, e); 35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return matchingMock; 37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson }; 39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return new OngoingInjecter() { 42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson public Object thenInject() { 43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson return null; 44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson }; 46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson} 49