/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.mockito.internal.configuration.injection.filter; import org.mockito.internal.util.reflection.BeanPropertySetter; import java.lang.reflect.Field; import java.util.Collection; import java.util.List; import static org.mockito.internal.exceptions.Reporter.cannotInjectDependency; import static org.mockito.internal.util.reflection.FieldSetter.setField; /** * This node returns an actual injecter which will be either : * * <ul> * <li>an {@link OngoingInjector} that do nothing if a candidate couldn't be found</li> * <li>an {@link OngoingInjector} that will try to inject the candidate trying first the property setter then if not possible try the field access</li> * </ul> */ public class TerminalMockCandidateFilter implements MockCandidateFilter { public OngoingInjector filterCandidate(final Collection<Object> mocks, final Field candidateFieldToBeInjected, final List<Field> allRemainingCandidateFields, final Object injectee) { if(mocks.size() == 1) { final Object matchingMock = mocks.iterator().next(); return new OngoingInjector() { public Object thenInject() { try { if (!new BeanPropertySetter(injectee, candidateFieldToBeInjected).set(matchingMock)) { setField(injectee, candidateFieldToBeInjected,matchingMock); } } catch (RuntimeException e) { throw cannotInjectDependency(candidateFieldToBeInjected, matchingMock, e); } return matchingMock; } }; } return OngoingInjector.nop; } }