Получить имя класса теста в статическом контексте от его родителя - PullRequest
3 голосов
/ 25 апреля 2019

В настоящее время я пытаюсь получить имя класса любого базового класса, который наследуется от BaseTest, в статическом контексте.Поэтому для объяснения я пишу базовый класс, который использует @BeforeClass из junit.Проблема в том, что я запускаю фальшивое приложение перед всеми тестами класса с собственной базой данных h2 в памяти.Я хочу назвать базу данных в качестве класса теста, чтобы позже я мог видеть, что было записано в базу данных за тест.

BaseTest:

public abstract class BaseTest {
private static final Map<String, String> testConfig = getTestConfig();
private static FakeApplication fakeApplication;

@BeforeClass
public static void onlyOnce(){
    fakeApplication = Helpers.fakeApplication(testConfig);
    Helpers.start(fakeApplication);
}

@AfterClass
public 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 Ответ

1 голос
/ 25 апреля 2019

Я нашел решение, используя '@ClassRule' и реализуя кастом 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);
        ...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...