Home | History | Annotate | Download | only in filter
      1 /*
      2  * Copyright (c) 2007 Mockito contributors
      3  * This program is made available under the terms of the MIT License.
      4  */
      5 package org.mockito.internal.configuration.injection.filter;
      6 
      7 import org.mockito.internal.util.reflection.BeanPropertySetter;
      8 
      9 import java.lang.reflect.Field;
     10 import java.util.Collection;
     11 import java.util.List;
     12 
     13 import static org.mockito.internal.exceptions.Reporter.cannotInjectDependency;
     14 import static org.mockito.internal.util.reflection.FieldSetter.setField;
     15 
     16 /**
     17  * This node returns an actual injecter which will be either :
     18  *
     19  * <ul>
     20  * <li>an {@link OngoingInjector} that do nothing if a candidate couldn't be found</li>
     21  * <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>
     22  * </ul>
     23  */
     24 public class TerminalMockCandidateFilter implements MockCandidateFilter {
     25     public OngoingInjector filterCandidate(final Collection<Object> mocks,
     26                                            final Field candidateFieldToBeInjected,
     27                                            final List<Field> allRemainingCandidateFields,
     28                                            final Object injectee) {
     29         if(mocks.size() == 1) {
     30             final Object matchingMock = mocks.iterator().next();
     31 
     32             return new OngoingInjector() {
     33                 public Object thenInject() {
     34                     try {
     35                         if (!new BeanPropertySetter(injectee, candidateFieldToBeInjected).set(matchingMock)) {
     36                             setField(injectee, candidateFieldToBeInjected,matchingMock);
     37                         }
     38                     } catch (RuntimeException e) {
     39                         throw cannotInjectDependency(candidateFieldToBeInjected, matchingMock, e);
     40                     }
     41                     return matchingMock;
     42                 }
     43             };
     44         }
     45 
     46         return OngoingInjector.nop;
     47 
     48     }
     49 }
     50