如何从 Junit 5 jupiter 扩展中的测试中获取字段

How to obtain a field from my test in a Junit 5 jupiter extension

我有一个自定义标签,用于测试我创建的驱动程序。我正在寻找一种在 BeforeEach 和 AfterEach 期间使用新的 Junit5 jupiter 扩展来初始化和退出此驱动程序的方法。

@Target({TYPE, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@ExtendWith(MyExtension.class)
public @interface MyDriver
{
} 

我看到有一个 AnnotationSupport.class 应该可以帮助您获取带有某些注释的字段,但还没有找到任何示例。

我想要的只是能够使用扩展中用我的注释注释的字段。

你可以这样做:

public class MyExtension implements BeforeEachCallback {
    @Override
    public void beforeEach(ExtensionContext context)  {
        context.getTestInstance().ifPresent(testInstance -> {
            List<Field> driverFields = AnnotationSupport.findAnnotatedFields(testInstance.getClass(), MyDriver.class);
            for (Field driverField : driverFields) {
                try {
                    Object fieldValue = driverField.get(testInstance);
                    // Do whatever you want with the field or its value
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

然后在测试 class 中的每个测试之前调用它,如下所示:

@MyDriver
class SomeTestThatUsesDriver {

    @MyDriver
    Object fieldWithAnnotation = "whatever";

    @Test
    void aTest() {
       ...
    }
}

不过,我不会做的是使用注释 @MyDriver 来添加扩展名和标记字段。我宁愿使用 @MyDriverField 之类的附加注释,或者直接在测试 class.

中添加扩展名