Привет,
Я не знаю, как обрабатывать 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, но я не уверен, что в конце концов это будет действительно проще.
Надеюсь, это помогло!