为了账号安全,请及时绑定邮箱和手机立即绑定

从父级获取静态上下文中的测试类名称

从父级获取静态上下文中的测试类名称

慕村9548890 2022-10-20 17:36:51
目前,我正在尝试在静态上下文中获取从 BaseTest 继承的任何底层类的类名。因此,为了解释,我正在编写一个使用@BeforeClassjunit 的基类。这里的问题是我在类的所有测试之前启动了一个假应用程序,它拥有自己的内存 h2 数据库。我想将数据库命名为测试类,以便稍后可以查看每次测试写入数据库的内容。基础测试:public abstract class BaseTest {private static final Map<String, String> testConfig = getTestConfig();private static FakeApplication fakeApplication;@BeforeClasspublic static void onlyOnce(){    fakeApplication = Helpers.fakeApplication(testConfig);    Helpers.start(fakeApplication);}@AfterClasspublic static void afterClass(){    Helpers.stop(fakeApplication);    fakeApplication = null;}private static Map<String, String> getTestConfig() {    //Here should bee FooTest in this case! But actually it's BaseTest    String className = MethodHandles.lookup().lookupClass().getSimpleName();    ...    configs.put("db.default.url", "jdbc:h2:file:./data/tests/" + className  + ";AUTO_SERVER=TRUE;MODE=Oracle;DB_CLOSE_ON_EXIT=FALSE");}例如一些儿童测试:public class FooTest extends BaseTest{     @Test      public void testFoo(){     }}我已经尝试了几件事,据我所知这是不可能的。但我只需要问是否有什么我还不知道的。
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

我找到了使用 '@ClassRule' 并实现 customg 的解决方案TestWatcher。由于在方法starting(Description description)之前被调用,@BeforeClass public static void beforeClass()我可以像这样使用它:


这是我的代码:


public abstract class BaseTest {

    @ClassRule

    public static CustomTestWatcher classWatcher = new CustomTestWatcher();

    private static Map<String, String> testConfig;

    private static FakeApplication fakeApplication;    



    public static class CustomTestWatcher extends TestWatcher {

        private String className = BaseTest.class.getSimpleName();


        public String getClassName() {

            return className;

        }


        private void setClassName(String className) {

            this.className = className;

        }


        @Override

        protected void starting(Description description) {

            //This will set className to = FooTest!

            setClassName(description.getClassName());

            System.out.println("\nStarting test class: " + className);

        }

    }


    @BeforeClass

    public static void beforeClass() {

        //Here now finally is FooTest!

        String className = classWatcher.getClassName();

        System.out.println("Creating Test Database and Fake Application for " + className);

        ...

    }


查看完整回答
反对 回复 2022-10-20
  • 1 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信