Skip to content

Commit ed6813d

Browse files
authored
Shadowed static methods/fields should override parent class behavior. (#1514)
1 parent cf13399 commit ed6813d

File tree

5 files changed

+33
-39
lines changed

5 files changed

+33
-39
lines changed

src/main/java/org/junit/runners/model/FrameworkField.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,7 @@ public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
4747

4848
@Override
4949
public boolean isShadowedBy(FrameworkField otherMember) {
50-
return false;
51-
}
52-
53-
@Override
54-
FrameworkField handlePossibleBridgeMethod(List<FrameworkField> members) {
55-
return this; // fields are never bridge methods
50+
return isStatic() && otherMember.getName().equals(getName());
5651
}
5752

5853
@Override

src/main/java/org/junit/runners/model/FrameworkMember.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,31 @@ public abstract class FrameworkMember<T extends FrameworkMember<T>> implements
1818
*
1919
* @return member that should be used, or {@code null} if no member should be used.
2020
*/
21-
abstract T handlePossibleBridgeMethod(List<T> members);
21+
final T handlePossibleShadowedMember(List<T> members) {
22+
for (int i = members.size() - 1; i >=0; i--) {
23+
T otherMember = members.get(i);
24+
if (isShadowedBy(otherMember)) {
25+
if (otherMember.isBridgeMethod()) {
26+
/*
27+
* We need to return the previously-encountered bridge method
28+
* because JUnit won't be able to call the parent method,
29+
* because the parent class isn't public.
30+
*/
31+
members.remove(i);
32+
return otherMember;
33+
}
34+
// We found a shadowed member that isn't a bridge method. Ignore it.
35+
return null;
36+
}
37+
}
38+
// No shadow or bridge method found. The caller should add *this* member.
39+
return self();
40+
}
41+
42+
@SuppressWarnings("unchecked")
43+
private T self() {
44+
return (T) this;
45+
}
2246

2347
abstract boolean isBridgeMethod();
2448

src/main/java/org/junit/runners/model/FrameworkMethod.java

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -141,33 +141,8 @@ public void validateNoTypeParametersOnArgs(List<Throwable> errors) {
141141
new NoGenericTypeParametersValidator(method).validate(errors);
142142
}
143143

144-
@Override
145-
FrameworkMethod handlePossibleBridgeMethod(List<FrameworkMethod> methods) {
146-
for (int i = methods.size() - 1; i >=0; i--) {
147-
FrameworkMethod otherMethod = methods.get(i);
148-
if (isShadowedBy(otherMethod)) {
149-
if (otherMethod.isBridgeMethod()) {
150-
/*
151-
* We need to return the previously-encountered bridge method
152-
* because JUnit won't be able to call the parent method,
153-
* because the parent class isn't public.
154-
*/
155-
methods.remove(i);
156-
return otherMethod;
157-
}
158-
// We found a shadowed member that isn't a bridge method. Ignore it.
159-
return null;
160-
}
161-
}
162-
// No shadow or bridge method found. The caller should add *this* member.
163-
return this;
164-
}
165-
166144
@Override
167145
public boolean isShadowedBy(FrameworkMethod other) {
168-
if (isStatic()) {
169-
return false;
170-
}
171146
if (!other.getName().equals(getName())) {
172147
return false;
173148
}

src/main/java/org/junit/runners/model/TestClass.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ protected static <T extends FrameworkMember<T>> void addToAnnotationLists(T memb
8484
for (Annotation each : member.getAnnotations()) {
8585
Class<? extends Annotation> type = each.annotationType();
8686
List<T> members = getAnnotatedMembers(map, type, true);
87-
T memberToAdd = member.handlePossibleBridgeMethod(members);
87+
T memberToAdd = member.handlePossibleShadowedMember(members);
8888
if (memberToAdd == null) {
8989
return;
9090
}

src/test/java/org/junit/tests/running/methods/AnnotationTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -586,13 +586,13 @@ public void test() {
586586
}
587587
}
588588

589-
public void testStaticMethodsNeverTreatedAsShadowed() throws Exception {
589+
public void testStaticMethodsCanBeTreatedAsShadowed() throws Exception {
590590
log = "";
591591
assertThat(testResult(SubStaticMethodShadowing.class), isSuccessful());
592592
assertEquals(
593-
"super.rule().before() sub.rule().before() "
593+
"sub.rule().before() "
594594
+ "Test "
595-
+ "sub.rule().after() super.rule().after() ",
595+
+ "sub.rule().after() ",
596596
log);
597597
}
598598

@@ -680,13 +680,13 @@ public void test() {
680680
}
681681
}
682682

683-
public void testStaticFieldsNeverTreatedAsShadowed() throws Exception {
683+
public void testStaticFieldsCanBeTreatedAsShadowed() throws Exception {
684684
log = "";
685685
assertThat(testResult(SubStaticFieldShadowing.class), isSuccessful());
686686
assertEquals(
687-
"super.rule.before() sub.rule.before() "
687+
"sub.rule.before() "
688688
+ "Test "
689-
+ "sub.rule.after() super.rule.after() ",
689+
+ "sub.rule.after() ",
690690
log);
691691
}
692692

0 commit comments

Comments
 (0)