【问题标题】:How to obtain a field from my test in a Junit 5 jupiter extension如何在 Junit 5 jupiter 扩展中从我的测试中获取字段
【发布时间】:2019-11-27 11:08:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你知道带有注释的字段会出现在哪些类中吗?
  • @AdwaitKumar 是的,我所有的测试类现在都将拥有它们。

标签: java junit5 junit-jupiter


【解决方案1】:

你可以这样做:

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();
                }
            }
        });
    }
}

然后在这样的测试类中的每个测试之前调用它:

@MyDriver
class SomeTestThatUsesDriver {

    @MyDriver
    Object fieldWithAnnotation = "whatever";

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

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

【讨论】:

  • 谢谢,你解决了我的问题,让我的驱动变得更好。我所做的就是您所说的,而不是创建扩展扩展的注释,而是在我需要的类之上添加带有 extendsWith 的扩展。
猜你喜欢
  • 2019-06-08
  • 2018-12-07
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2016-12-29
  • 2018-04-11
  • 1970-01-01
  • 2013-07-21
相关资源
最近更新 更多