org.mockito.internal.configuration.injection.PropertyAndSetterInjection Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mockito-all Show documentation
Show all versions of mockito-all Show documentation
Mock objects library for java
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.configuration.injection;
import org.mockito.exceptions.Reporter;
import org.mockito.exceptions.base.MockitoException;
import org.mockito.internal.configuration.injection.filter.*;
import org.mockito.internal.util.ListUtil;
import org.mockito.internal.util.reflection.FieldInitializationReport;
import org.mockito.internal.util.reflection.FieldInitializer;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.*;
/**
* Inject mocks using first setters then fields, if no setters available.
*
*
* Algorithm :
* for each field annotated by @InjectMocks
*
* - copy mocks set
*
- initialize field annotated by @InjectMocks
*
- for each field in @InjectMocks type ordered from sub-type to super-type
*
* - 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)
*
- 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.
*
*/
public class PropertyAndSetterInjection extends MockInjectionStrategy {
private final MockCandidateFilter mockCandidateFilter = new TypeBasedCandidateFilter(new NameBasedCandidateFilter(new FinalMockCandidateFilter()));
private Comparator superTypesLast = new Comparator() {
public int compare(Field field1, Field field2) {
Class> field1Type = field1.getType();
Class> field2Type = field2.getType();
if(field1Type.isAssignableFrom(field2Type)) {
return 1;
}
if(field2Type.isAssignableFrom(field1Type)) {
return -1;
}
return 0;
}
};
private ListUtil.Filter notFinalOrStatic = new ListUtil.Filter() {
public boolean isOut(Field object) {
return Modifier.isFinal(object.getModifiers()) || Modifier.isStatic(object.getModifiers());
}
};
public boolean processInjection(Field field, Object fieldOwner, Set