首页 > 解决方案 > 如何在extensionContext中获取变量值

问题描述

如何将结果字段的值放入我的 TestReporter 类?

@ExtendWith({TestReporter.class})
private TestClass{
   String result;

   @Test
   void testA(){
     //some action here
     result = some result;
   }
}
public class TestReporter implements BeforeAllCallback, BeforeTestExecutionCallback, AfterAllCallback,
       TestWatcher {
    private static ExtentHtmlReporter htmlReporter;
    private static ExtentReports extent;
    private static ExtentTest test;

    @Override
    public void beforeAll(ExtensionContext context) throws Exception {
       //set up extent report
    }


   @Override
   public void testSuccessful(ExtensionContext context) {
     //not possible, but desired
     test.pass(context.getElement.get("result"), MediaEntityBuilder.createScreenCaptureFromPath("test"+count+".png").build());

   }

}

我一直在研究如何做到这一点,但不确定我正在寻找的东西是否可能或如何实施

标签: javaunit-testingjunitjunit5

解决方案


TLDR;

在必须实现适当回调的扩展中使用反射,例如AfterEachCallback. 通过 抓取测试类的实例context.getRequiredTestInstance()

长版

@ExtendWith(TestReporter.class)
public class TestClass {

    String result;

    @Test
    void testA() {
        result = "some result";
    }
}

class TestReporter implements AfterEachCallback {
    @Override
    public void afterEach(final ExtensionContext context) throws Exception {
        Object testInstance = context.getRequiredTestInstance();

        Field resultField = testInstance.getClass().getDeclaredField("result");

        String resultValue = (String) resultField.get(testInstance);

        System.out.println("Value of result: " + resultValue);
    }
}

请注意 anAfterAllContext无权访问测试实例,因为每个测试方法都有一个实例。使用TestWatcher代替AfterEachCallback也可以。


推荐阅读