Overview

While working on #33925, I noticed that the search algorithm for @BeanOverride-annotated fields registers bean override handlers with "bottom up" semantics; whereas, handlers should be registered with "top down" semantics while traversing a test class hierarchy.

In other words, a bean override in a superclass currently takes precedence over a bean override in a subclass, which is incorrect.

Example

@ExtendWith(SpringExtension.class)
class BaseTests {

    @TestBean("enigma")
    String enigma;

    static String enigma() {
        return "enigma in superclass";
    }

    @Test
    void test() {
        assertThat(enigma).isEqualTo("enigma in superclass");
    }
}
class ExtendedTests extends BaseTests {

    @TestBean(name = "enigma", methodName = "localEnigma")
    String enigma;

    static String localEnigma() {
        return "enigma in subclass";
    }

    @Test
    @Override
    void test() {
        assertThat(enigma).isEqualTo("enigma in subclass");
    }
}

BaseTests passes as expected; however, ExtendedTests fails with the following error.

org.opentest4j.AssertionFailedError: 
expected: "enigma in subclass"
 but was: "enigma in superclass"