Skip to content

Commit

Permalink
Fixed bug where non-annotated fields in a @tested(fullyInitialized = …
Browse files Browse the repository at this point in the history
…true) were erroneously initialized; closes #206.
  • Loading branch information
rliesenfeld committed Sep 12, 2015
1 parent 5cfc014 commit 3f0bf2d
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 11 deletions.
25 changes: 14 additions & 11 deletions main/src/mockit/internal/expectations/injection/FieldInjection.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,26 +21,28 @@ final class FieldInjection
{
private static final Pattern TYPE_NAME = compile("class |interface |java\\.lang\\.");

@Nonnull private final TestedField testedField;
@Nonnull private final InjectionState injectionState;
boolean requireDIAnnotation;
@Nonnull private final ProtectionDomain protectionDomainOfTestedClass;
@Nullable private final String codeLocationParentPath;
@Nonnull final String nameOfTestedClass;
@Nullable final FullInjection fullInjection;
@Nullable private final FullInjection fullInjection;

FieldInjection(@Nonnull TestedField testedField, @Nonnull Class<?> testedClass, boolean fullInjection)
{
this.testedField = testedField;
injectionState = testedField.injectionState;
requireDIAnnotation = testedField.requireDIAnnotation;
protectionDomainOfTestedClass = testedClass.getProtectionDomain();
CodeSource codeSource = protectionDomainOfTestedClass.getCodeSource();
codeLocationParentPath = codeSource == null ? null : new File(codeSource.getLocation().getPath()).getParent();
nameOfTestedClass = testedClass.getName();
this.fullInjection = fullInjection ? new FullInjection(testedField.injectionState) : null;
this.fullInjection = fullInjection ? new FullInjection(injectionState) : null;
}

@Nonnull
List<Field> findAllTargetInstanceFieldsInTestedClassHierarchy(@Nonnull Class<?> testedClass)
{
testedField.requireDIAnnotation = false;
requireDIAnnotation = false;

List<Field> targetFields = new ArrayList<Field>();
Class<?> classWithFields = testedClass;
Expand Down Expand Up @@ -72,7 +74,7 @@ private boolean isEligibleForInjection(@Nonnull Field field)
boolean annotated = isAnnotated(field) != KindOfInjectionPoint.NotAnnotated;

if (annotated) {
testedField.requireDIAnnotation = true;
requireDIAnnotation = true;
return true;
}

Expand Down Expand Up @@ -175,7 +177,6 @@ private static boolean notAssignedByConstructor(@Nonnull Field field, @Nonnull O
@Nullable
private Object getValueForFieldIfAvailable(@Nonnull List<Field> targetFields, @Nonnull Field fieldToBeInjected)
{
InjectionState injectionState = testedField.injectionState;
injectionState.setTypeOfInjectionPoint(fieldToBeInjected.getGenericType());

String targetFieldName = fieldToBeInjected.getName();
Expand All @@ -195,7 +196,7 @@ private Object getValueForFieldIfAvailable(@Nonnull List<Field> targetFields, @N
KindOfInjectionPoint kindOfInjectionPoint = isAnnotated(fieldToBeInjected);

if (fullInjection != null) {
if (testedField.requireDIAnnotation && kindOfInjectionPoint == KindOfInjectionPoint.NotAnnotated) {
if (requireDIAnnotation && kindOfInjectionPoint == KindOfInjectionPoint.NotAnnotated) {
return null;
}

Expand Down Expand Up @@ -226,8 +227,6 @@ private Object getValueForFieldIfAvailable(@Nonnull List<Field> targetFields, @N
private boolean withMultipleTargetFieldsOfSameType(
@Nonnull List<Field> targetFields, @Nonnull Field fieldToBeInjected)
{
InjectionState injectionState = testedField.injectionState;

for (Field targetField : targetFields) {
if (
targetField != fieldToBeInjected &&
Expand All @@ -243,13 +242,17 @@ private boolean withMultipleTargetFieldsOfSameType(
void fillOutDependenciesRecursively(@Nonnull Object dependency)
{
Class<?> dependencyClass = dependency.getClass();
boolean previousRequireDIAnnotation = requireDIAnnotation;
List<Field> targetFields = findAllTargetInstanceFieldsInTestedClassHierarchy(dependencyClass);

if (!targetFields.isEmpty()) {
InjectionState injectionState = testedField.injectionState;
List<MockedType> currentlyConsumedInjectables = injectionState.saveConsumedInjectables();

injectIntoEligibleFields(targetFields, dependency);

injectionState.restoreConsumedInjectables(currentlyConsumedInjectables);
}

requireDIAnnotation = previousRequireDIAnnotation;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ void instantiateWithInjectableValues(@Nonnull Object testClassInstance)

if (targetFields == null) {
targetFields = fieldInjection.findAllTargetInstanceFieldsInTestedClassHierarchy(testedClass);
requireDIAnnotation = fieldInjection.requireDIAnnotation;
}

fieldInjection.injectIntoEligibleFields(targetFields, testedObject);
Expand Down
11 changes: 11 additions & 0 deletions main/test/mockit/TestedClassWithFullAnnotatedDITest.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,12 @@ static final class TestedClass
@Inject ItfWithTwoImplsButOnlyOneLoaded anotherDependency;
@Inject private Logger log1;
@Inject private Logger log2;
Logger log3;
Value value;
}

static final class Value {}

public interface ItfWithSingleLoadedImpl {}
public static final class SingleLoadedImpl implements ItfWithSingleLoadedImpl { @EJB ItfWithTwoLoadedImpls ejb; }

Expand Down Expand Up @@ -66,4 +70,11 @@ public void injectLoggerFieldsWithLoggerCreatedWithTestedClassName()
assertEquals(TestedClass.class.getName(), tested.log1.getName());
assertSame(tested.log2, tested.log1);
}

@Test
public void leaveNonAnnotatedFieldsUninitialized()
{
assertNull(tested.value);
assertNull(tested.log3);
}
}

0 comments on commit 3f0bf2d

Please sign in to comment.