JUnit 5:在什么情况下 ExtensionContext.getTestMethod() 不可用?

JUnit 5: under what conditions is ExtensionContext.getTestMethod() not available?

我正在开发 JUnit 5 扩展,我在其中使用 ExtensionContext.getTestMethod() 从测试方法中提取注释。

Optional<Method> testMethod = context.getTestMethod();

if (testMethod.isPresent()) {
    MyAnnotation annotation = testMethod.get().getAnnotation(MyAnnotation.class);
    //snip...
}

根据 javadoc,方法 returns

"an Optional containing the method; never null but potentially empty"

我发现这有点令人困惑。什么情况下会缺少测试方法?

假设我有这个扩展:

import org.junit.jupiter.api.extension.*;
import java.lang.reflect.Method;
import java.util.Optional;

public class MyExtension implements BeforeAllCallback, BeforeEachCallback {
    @Override
    public void beforeAll(ExtensionContext context) throws Exception {
        Optional<Method> testMethod = context.getTestMethod();
    }
    @Override
    public void beforeEach(ExtensionContext context) {
        Optional<Method> testMethod = context.getTestMethod();
    }
}

和这个测试 class:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(MyExtension.class)
class MyTest {
    @Test
    void test1() {
    }
    @Test
    void test2() {
    }
}

执行MyExtension.beforeAll()时:应该context.getTestMethod()return哪个测试方法? MyExtension.beforeAll() 不是 test-specific,因此在 beforeAll() 内对 context.getTestMethod() 的调用不能 return 测试方法!

MyExtension.beforeEach() 中的情况不同:此方法在每个特定测试之前调用(即在执行 test1() 之前调用一次,在执行 test2() 之前调用一次)并且正确地与beforeEach() 方法对 context.getTestMethod() 的调用 return 是一个带有相应方法对象的可选对象。