Skip to content

Commit 710174f

Browse files
authored
Merge pull request #499 from avaje/feature/fix-testscope-inherited-fields-injection
Fix for @InjectTest with inherited field injection
2 parents accbf97 + a7ceaf7 commit 710174f

File tree

5 files changed

+51
-11
lines changed

5 files changed

+51
-11
lines changed

inject-test/src/main/java/io/avaje/inject/test/GlobalTestScope.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
/**
1313
* Holds the global BeanScope used for all tests.
1414
*/
15-
final class GlobalTestScope implements ExtensionContext.Store.CloseableResource {
15+
final class GlobalTestScope implements ExtensionContext.Store.CloseableResource {
1616

1717
private static final System.Logger log = AppLog.getLogger("io.avaje.inject");
1818

inject-test/src/main/java/io/avaje/inject/test/MetaReader.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.lang.reflect.Modifier;
1818
import java.lang.reflect.Type;
1919
import java.util.ArrayList;
20+
import java.util.LinkedList;
2021
import java.util.List;
2122

2223
final class MetaReader {
@@ -38,10 +39,23 @@ final class MetaReader {
3839

3940
MetaReader(Class<?> testClass, Plugin plugin) {
4041
this.plugin = plugin;
41-
this.methodFinder = new SetupMethods(testClass);
42-
for (Field field : testClass.getDeclaredFields()) {
43-
readField(field);
42+
final var hierarchy = typeHierarchy(testClass);
43+
this.methodFinder = new SetupMethods(hierarchy);
44+
for (Class<?> aTestClass : hierarchy) {
45+
for (Field field : aTestClass.getDeclaredFields()) {
46+
readField(field);
47+
}
48+
}
49+
}
50+
51+
private static LinkedList<Class<?>> typeHierarchy(Class<?> testClass) {
52+
var hierarchy = new LinkedList<Class<?>>();
53+
var analyzedClass = testClass;
54+
while (analyzedClass != null && !analyzedClass.equals(Object.class)) {
55+
hierarchy.addFirst(analyzedClass);
56+
analyzedClass = analyzedClass.getSuperclass();
4457
}
58+
return hierarchy;
4559
}
4660

4761
boolean hasClassInjection() {

inject-test/src/main/java/io/avaje/inject/test/SetupMethods.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,7 @@ final class SetupMethods {
1414
private final List<Method> staticMethods = new ArrayList<>();
1515
private final List<Method> instanceMethods = new ArrayList<>();
1616

17-
SetupMethods(Class<?> testClass) {
18-
var analyzedClass = testClass;
19-
var hierarchy = new LinkedList<Class<?>>();
20-
while (analyzedClass != null && !analyzedClass.equals(Object.class)) {
21-
hierarchy.addFirst(analyzedClass);
22-
analyzedClass = analyzedClass.getSuperclass();
23-
}
17+
SetupMethods(LinkedList<Class<?>> hierarchy) {
2418
for (Class<?> aClass : hierarchy) {
2519
for (Method method : aClass.getDeclaredMethods()) {
2620
if (method.getDeclaredAnnotation(Setup.class) != null) {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.example.inherit;
2+
3+
import jakarta.inject.Inject;
4+
import org.example.coffee.core.Steamer;
5+
6+
public abstract class MyOneAbstract {
7+
8+
@Inject
9+
Steamer steamer;
10+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.example.inherit;
2+
3+
import io.avaje.inject.test.InjectExtension;
4+
import jakarta.inject.Inject;
5+
import org.example.inherit.notpublic.PubExposed;
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.ExtendWith;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
@ExtendWith(InjectExtension.class)
12+
public class MyOneTest extends MyOneAbstract {
13+
14+
@Inject
15+
PubExposed something;
16+
17+
@Test
18+
void test_expect_inheritedFieldIsInjected() {
19+
assertThat(something).isNotNull();
20+
assertThat(steamer).isNotNull();
21+
}
22+
}

0 commit comments

Comments
 (0)