gpt4 book ai didi

testing - 使用 junit 在类中的每个测试之前运行 DropwizardAppRule

转载 作者:行者123 更新时间:2023-11-28 20:49:54 24 4
gpt4 key购买 nike

我有一个包含多个测试的测试类。目前我有这个来启动服务器,删除数据库等:

@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 的值。有什么想法吗?

最佳答案

嗨,
我不知道如何从 DropwizardAppRule“内部”处理数据库,所以我可能无法真正回答你的问题......我实际上有另一个问题自己尝试使用 DropwizardAppRule 没有正确设置并在测试之间拆除。 (因此,如果您以这种方式取得进展,我希望您能提供见解)。


无论如何,我认为您需要在 DropwizardAppRule 之外处理您的数据库并在规则中提供它。我们依靠自定义和外部 TestsRules 解决了 DB 清除问题:

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(...) 来链接自定义语句。 There's our RulesHelper if you want to take a look .这样数据库就可以由规则干净地处理,我们可以使用 @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,但我不确定它是否真的更容易结束。

希望这对您有所帮助!

关于testing - 使用 junit 在类中的每个测试之前运行 DropwizardAppRule,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51009757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com