我正在使用一个JUnit 5扩展,我使用ExtensionContext.getTestMethod()从测试方法中提取注释。
Optional<Method> testMethod = context.getTestMethod();
if (testMethod.isPresent()) {
MyAnnotation annotation = testMethod.get().getAnnotation(MyAnnotation.class);
//snip...
}
根据javadoc,该方法返回
"an包含方法的可选;绝不为空,但可能为空
我觉得这有点令人困惑。在什么情况下测试方法会丢失?
假设我有这个扩展名:
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();
}
}
和这个测试类:
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()
应该返回哪个测试方法?MyExtension.beforeAll()
不是特定于测试的,因此在beforeAll()
中对context.getTestMethod()
的调用不能返回测试方法!
在MyExtension.beforeEach()
中情况不同:该方法在每个特定测试之前被调用(即在test1()
执行之前一次,在test2()
执行之前一次),并且在beforeEach()
方法中,对context.getTestMethod()
的调用返回一个带有相应方法对象的可选对象。