Запуск DropwizardAppRule перед каждым тестом в классе с использованием junit - PullRequest
0 голосов
/ 24 июня 2018

У меня есть тестовый класс, в котором есть несколько тестов. На данный момент у меня есть это, чтобы запустить сервер, стереть базу данных и т. Д .:

@ClassRule
public static final DropwizardAppRule<ServiceConfig> RULE =
        new DropwizardAppRule<ServiceConfig>(ServiceApp.class, ResourceHelpers.resourceFilePath("config.yml"));

Все мои тесты работают с этим индивидуально. Но когда я запускаю их все вместе, некоторые из них терпят неудачу, так как другие тесты изменяют данные. Я попытался сделать следующее, но я получаю нулевые указатели при вызове RULE.getPort ():

@ClassRule
public static DropwizardAppRule<ServiceConfig> RULE;

@Before
public void beforeClass() {
     RULE = new DropwizardAppRule<ServiceConfig>(ServiceApp.class, ResourceHelpers.resourceFilePath("config.yml"));
}

Я бы ожидал, что это сработает, но, похоже, он неправильно устанавливает значения RULE. Есть идеи?

1 Ответ

0 голосов
/ 28 июня 2018

Привет,
Я не знаю, как обрабатывать db "изнутри" DropwizardAppRule, поэтому я не могу ответить на ваш вопрос ... У меня, собственно, есть другая проблема, я пытаюсь с DropwizardAppRule неправильно настроить иснесены между тестами.(Так что, если вы добились прогресса в этом направлении, я бы хотел, чтобы вы поняли).


В любом случае, я думаю, вам нужно обработать вашу БД вне DropwizardAppRule и передать ее в Правиле.Мы решили очистку БД, полагаясь на пользовательские и внешние TestsRules:

public class CockpitApplicationRule implements TestRule {

public static class App extends CockpitApplication<CockpitConfiguration> {
    // only needed because of generics
}

public final DropwizardAppRule<CockpitConfiguration> dw;

public final EmbeddedDatabaseRule db;

public CockpitApplicationRule(String config, ConfigOverride... configOverrides) {
    this.db = EmbeddedDatabaseRule.builder()
            .initializedByPlugin(LiquibaseInitializer.builder().withChangelogResource("migrations.xml").build())
            .build();
    this.dw = new DropwizardAppRule<>(App.class, ResourceHelpers.resourceFilePath(config),
            ConfigOverride.config("database.url", () -> this.db.getConnectionJdbcUrl()));
}

@Override
@Nullable
public Statement apply(@Nullable Statement base, @Nullable Description description) {
    assert base != null;
    assert description != null;

    return RulesHelper.chain(base, description, dw, RulesHelper.dropDbAfter(db), db);
}

public DSLContext db() {
    return DSL.using(db.getConnectionJdbcUrl());
}
}

В основном мы переопределяем TestRule apply (...) для цепочки пользовательских операторов. Вот наш RulesHelper, если вы хотите посмотреть .Таким образом, БД четко обрабатывается Правилами, и мы можем заполнить нашу тестовую БД тестовыми классами, используя @Before методы настройки.

org.zapodot.junit.db.EmbeddedDatabaseRule Это внешняя зависимость, которая позволяет нам довольно легко создавать экземпляры БД для наших тестов.

RulesHelper.dropDbAfter выполняетфактическая очистка:

public static TestRule dropDbAfter(EmbeddedDatabaseRule db) {
    return after(() -> DSL.using(db.getConnectionJdbcUrl()).execute("DROP ALL OBJECTS"));
}

Вы должны иметь возможность настроить и очистить БД с помощью методов @Before и @After без полного использования TestRules, но я не уверен, что в конце концов это будет действительно проще.

Надеюсь, это помогло!

...