【问题标题】:How to retrieve value from custom junit 5 tags using java?如何使用java从自定义junit 5标签中检索值?
【发布时间】:2021-09-24 14:04:01
【问题描述】:

我正在尝试从自定义 Junit 5 标记中检索值,但在检索 TestCaseDetails 标记的值时遇到问题。

@Test
@Tags(value ={@Tag("TT"), @Tag("MM")})
@TestCaseDetails(Id="1234")
@MongoDataSet(value = "/dataset/SampleTestData.json", cleanAfter = true, cleanBefore = true)

TestCaseDetails.class

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("api") @Tag("identifier")
@Test
public @interface TestCaseDetails {
 String Id();
}

我想打印与 TestCaseDetails 标签关联的 1234 值。

我尝试过的:

   class JUnit5ExampleTest {


    @Test
    @Tags(value ={@Tag("TT"), @Tag("MM")})
    @TestCaseDetails(testcaseId="1234")
    @MongoDataSet(value = "/dataset/SampleTestData.json", cleanAfter = true, cleanBefore = true)
    void multipleTags() throws Exception {

       System.out.println("*******************JUnit5ExampleTest********************************");
   //Solution 1:     
   Method[] methods = JUnit5ExampleTest.class.getMethods();
        for (Method m : methods) {
            if (m.isAnnotationPresent(TestCaseDetails.class)) {
                TestCaseDetails ta = m.getAnnotation(TestCaseDetails.class);
                System.out.println("%%%%%%%%%%%%"+ta.Id());
            }
        }

  //Solution 2:      
    JUnit5ExampleTest ob=new JUnit5ExampleTest();
        try {
            Class c = ob.getClass();

            Method m = c.getMethod("multipleTags");

            TestCaseDetails anno = m.getAnnotation(TestCaseDetails.class);

            System.out.println(anno.Id() );
        } catch (NoSuchMethodException exc) {
            System.out.println("Method Not Found.");
        }
    }
}

不想使用以下解决方案:

【问题讨论】:

  • (我没有投反对票,但是)你想做的完整的可重复的例子(你想在运行时阅读注释?你想配置一个类或全局测试并使用自定义设置进行扩展?... )
  • 你知道TestInfo 在 JUnit 5 中可以做什么吗?它有一个方法getTags()...好吧,你不想要它...
  • @josejuan :感谢您的回复,我已经添加了尝试过的解决方案,但它无法正常工作。
  • @deHaar:感谢您的回复,是的,我知道 TestInfo 但不想使用它。
  • 你不想使用TestInfo的原因是什么?是不是因为不想给测试方法加参数?如果是这种情况,是否可以选择编写 JUnit 扩展?

标签: java junit5


【解决方案1】:

如果TestInfo是一个选项,它可以用作测试方法的参数。

public class TestMeta
{
    @Test
    @TestCaseDetails(id = "g1")
    void test(TestInfo info)
    {
        //Retrieve test case details annotation for this test
        Optional<TestCaseDetails> testCaseDetails = info.getTestMethod().flatMap(m -> Optional.ofNullable(m.getAnnotation(TestCaseDetails.class)));
        testCaseDetails.ifPresent(caseDetails -> System.out.println("Test case: " + caseDetails.id()));

        //Remaining test code...
    }
}

如果只在一个测试中需要它,这可能没问题,但它也可以放入扩展中以实现可重用性:

public class TestCaseDetailsPrinter implements BeforeTestExecutionCallback
{
    @Override
    public void beforeTestExecution(ExtensionContext context) throws Exception
    {
        context.getElement()
               .flatMap(m -> Optional.ofNullable(m.getAnnotation(TestCaseDetails.class)))
               .ifPresent(testCaseDetails -> System.out.println("Test case: " + testCaseDetails.id()));
    }
}

并像这样使用:

@ExtendWith(TestCaseDetailsPrinter.class)
public class TestMeta2
{
    @Test
    @TestCaseDetails(id = "g2")
    void test()
    {
        //Remaining test code
    }
}

这两种方法的关键部分是访问测试的Method 对象,然后可以通过反射(使用getAnnotation())查询该对象以读取该方法中存在的注释。

【讨论】:

  • 我不想在我的 multipleTags() 方法中使用 TestInfo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 2019-03-03
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
相关资源
最近更新 更多