【发布时间】: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 扩展?