PropertyAndSetterInjection
Date: 2015-09-18

org.mockito.internal.configuration.injection

## Class PropertyAndSetterInjection

- java.lang.Object
- - org.mockito.internal.configuration.injection.MockInjectionStrategy
  - - org.mockito.internal.configuration.injection.PropertyAndSetterInjection

-     public class PropertyAndSetterInjection
      extends MockInjectionStrategy

  Inject mocks using first setters then fields, if no setters available.

  Algorithm :
  for each field annotated by @InjectMocks

  - initialize field annotated by @InjectMocks
  - for each fields of a class in @InjectMocks type hierarchy
    - make a copy of mock candidates
    - order fields rom sub-type to super-type, then by field name
    - for the list of fields in a class try two passes of :
      - find mock candidate by type
      - if more than *one* candidate find mock candidate on name
      - if one mock candidate then
        - set mock by property setter if possible
        - else set mock by field injection
      - remove mock from mocks copy (mocks are just injected once in a class)
      - remove injected field from list of class fields
    - else don't fail, user will then provide dependencies

  Note: If the field needing injection is not initialized, the strategy tries to create one using a no-arg constructor of the field type.

- - ### Constructor Summary

    Constructors
    Constructor and Description
    `PropertyAndSetterInjection()`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | `processInjection(java.lang.reflect.Field injectMocksField, java.lang.Object injectMocksFieldOwner, java.util.Set<java.lang.Object> mockCandidates)` Process actual injection.

    - ### Methods inherited from class org.mockito.internal.configuration.injection.MockInjectionStrategy

      `nop, process, thenTry`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### PropertyAndSetterInjection

          public PropertyAndSetterInjection()

  - ### Method Detail

    - #### processInjection

          public boolean processInjection(java.lang.reflect.Field injectMocksField,
                                 java.lang.Object injectMocksFieldOwner,
                                 java.util.Set<java.lang.Object> mockCandidates)

      Description copied from class: `MockInjectionStrategy`
      Process actual injection.

      Don't call this method directly, instead call `MockInjectionStrategy.process(Field, Object, Set)`

      Specified by:
        `processInjection` in class `MockInjectionStrategy`
      Parameters:
        `injectMocksField` - Field needing injection
        `injectMocksFieldOwner` - Field owner instance.
        `mockCandidates` - Pool of mocks to inject.
      Returns:
        `true` if injection occurred, `false` otherwise