读取 JUNIT 的自定义注解
Reading custom annotation for JUNIT
我有一个自定义注释,我将其用作配置以启动 Junit 的一次性设置。
@Target(TYPE) @Retention(RUNTIME)
public @interface MyAnnotation{
String host();
int port();
}
测试class:
@MyAnnotation(host="0.0.0.0", port=4567)
public class MyTest extends MyAbstractClass{
@Test
public void myTest(){
//do testy things
}
}
超级class:
public class MyAbstractClass{
@BeforeAll
public static void start(){
Config cfg = readConfig();
//Use config to do one time set-up
}
private static Config readConfig(){
MyAnnotation ann = MyTest.class.getAnnotation(MyAnnotation.class);
return new Config(ann.host(), ann.port());
}
}
所以目前,我在 readConfig(..) 中硬编码测试名称 class (MyTest)。
当我添加第二个测试 class.
时,这将不起作用
一种解决方法是:
- 在 MyTest 中添加另一个 @BeforeAll 方法,它将调用 super-class 中的 @BeforeAll 并将 class 名称作为参数传递。
但是,我很好奇我是否可以通过一些反射魔法读取 superclass 中 executing subclass 的名称。
欢迎任何想法。
谢谢
@BeforeAll
注释的存在表明您使用的是 JUnit 5。在这种情况下,您可以使用。
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.TestInfo;
public class MyAbstractClass {
@BeforeAll
public static void start(TestInfo ti) {
Config cfg=readConfig(ti.getTestClass().orElseThrow(IllegalStateException::new));
//Use config to do one time set-up
}
private static Config readConfig(Class<?> testClass) {
MyAnnotation ann = testClass.getAnnotation(MyAnnotation.class);
return new Config(ann.host(), ann.port());
}
}
另见 TestInfo
API documentation。
这不是“Reflection Magic”,而是 JUnit 自身提供的功能,但也只有 JUnit 知道调用 @BeforeAll
注释的 static
方法与特定的关联测试 class 它将要处理。
我有一个自定义注释,我将其用作配置以启动 Junit 的一次性设置。
@Target(TYPE) @Retention(RUNTIME)
public @interface MyAnnotation{
String host();
int port();
}
测试class:
@MyAnnotation(host="0.0.0.0", port=4567)
public class MyTest extends MyAbstractClass{
@Test
public void myTest(){
//do testy things
}
}
超级class:
public class MyAbstractClass{
@BeforeAll
public static void start(){
Config cfg = readConfig();
//Use config to do one time set-up
}
private static Config readConfig(){
MyAnnotation ann = MyTest.class.getAnnotation(MyAnnotation.class);
return new Config(ann.host(), ann.port());
}
}
所以目前,我在 readConfig(..) 中硬编码测试名称 class (MyTest)。 当我添加第二个测试 class.
时,这将不起作用一种解决方法是:
- 在 MyTest 中添加另一个 @BeforeAll 方法,它将调用 super-class 中的 @BeforeAll 并将 class 名称作为参数传递。
但是,我很好奇我是否可以通过一些反射魔法读取 superclass 中 executing subclass 的名称。 欢迎任何想法。
谢谢
@BeforeAll
注释的存在表明您使用的是 JUnit 5。在这种情况下,您可以使用。
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.TestInfo;
public class MyAbstractClass {
@BeforeAll
public static void start(TestInfo ti) {
Config cfg=readConfig(ti.getTestClass().orElseThrow(IllegalStateException::new));
//Use config to do one time set-up
}
private static Config readConfig(Class<?> testClass) {
MyAnnotation ann = testClass.getAnnotation(MyAnnotation.class);
return new Config(ann.host(), ann.port());
}
}
另见 TestInfo
API documentation。
这不是“Reflection Magic”,而是 JUnit 自身提供的功能,但也只有 JUnit 知道调用 @BeforeAll
注释的 static
方法与特定的关联测试 class 它将要处理。