blob: 3418bb6b9841257f6e3e4d7058fbaea76ccac6a2 [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;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import static org.mockito.internal.util.Checks.checkItemsNotNull;
import static org.mockito.internal.util.Checks.checkNotNull;
import static org.mockito.internal.util.collections.Sets.newMockSafeHashSet;
/**
* Internal injection configuration utility.
*
* <p>
* Allow the user of this class to configure the way the injection of mocks will happen.
* </p>
*
*/
public class MockInjection {
/**
* Create a new configuration setup for a field
*
*
* @param field Field needing mock injection
* @param ofInstance Instance owning the <code>field</code>
* @return New configuration builder
*/
public static OngoingMockInjection onField(Field field, Object ofInstance) {
return new OngoingMockInjection(field, ofInstance);
}
/**
* Create a new configuration setup for fields
*
*
* @param fields Fields needing mock injection
* @param ofInstance Instance owning the <code>field</code>
* @return New configuration builder
*/
public static OngoingMockInjection onFields(Set<Field> fields, Object ofInstance) {
return new OngoingMockInjection(fields, ofInstance);
}
/**
* Ongoing configuration of the mock injector.
*/
public static class OngoingMockInjection {
private Set<Field> fields = new HashSet<Field>();
private Set<Object> mocks = newMockSafeHashSet();
private Object fieldOwner;
private MockInjectionStrategy injectionStrategies = MockInjectionStrategy.nop();
private MockInjectionStrategy postInjectionStrategies = MockInjectionStrategy.nop();
private OngoingMockInjection(Field field, Object fieldOwner) {
this(Collections.singleton(field), fieldOwner);
}
private OngoingMockInjection(Set<Field> fields, Object fieldOwner) {
this.fieldOwner = checkNotNull(fieldOwner, "fieldOwner");
this.fields.addAll(checkItemsNotNull(fields, "fields"));
}
public OngoingMockInjection withMocks(Set<Object> mocks) {
this.mocks.addAll(checkNotNull(mocks, "mocks"));
return this;
}
public OngoingMockInjection tryConstructorInjection() {
injectionStrategies.thenTry(new ConstructorInjection());
return this;
}
public OngoingMockInjection tryPropertyOrFieldInjection() {
injectionStrategies.thenTry(new PropertyAndSetterInjection());
return this;
}
public OngoingMockInjection handleSpyAnnotation() {
postInjectionStrategies.thenTry(new SpyOnInjectedFieldsHandler());
return this;
}
public void apply() {
for (Field field : fields) {
injectionStrategies.process(field, fieldOwner, mocks);
postInjectionStrategies.process(field, fieldOwner, mocks);
}
}
}
}