blob: 3a66c7e2b2d49944d11080b53039d6573c03a375 [file] [log] [blame]
/*
* 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;
}
}