gpt4 book ai didi

java - 如何为嵌入式mongo(flapdoodle)全局设置WriteConcern以修复间歇性测试失败

转载 作者:行者123 更新时间:2023-11-30 07:19:51 37 4
gpt4 key购买 nike

问题:有没有办法更改(Flapdoodle)嵌入式 mongo 的配置,以便我可以保证写入发生在读取之前?请注意,这个问题具体是关于 Flapdoodle 的实现,而不是关于 MongoDB一般的。我只想在测试和配置中应用它(如果可能的话),而不是遍历所有 Mongo 操作并在各处设置写入关注点。

详细信息

我在测试环境中使用 Spring + 嵌入式 mongo。 Maven 依赖关系如下所示:

<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>1.50.1</version>
<scope>test</scope>
</dependency>

使用测试配置类:

@Configuration
@EnableAutoConfiguration(exclude = { EmbeddedMongoAutoConfiguration.class })
@EnableMongoRepositories(basePackages = "path.to.repos")
public class TestMongoConfig {
private static final String DESTROY_METHOD_CLOSE = "close";
private static final String DESTROY_METHOD_STOP = "stop";

private static final Logger LOGGER = LoggerFactory.getLogger(TestMongoConfig.class);

@Autowired
private MongoProperties mongoProperties;

@Autowired(required = false)
private MongoClientOptions mongoClientOptions;

@Autowired
private Environment environment;

@Bean(destroyMethod = DESTROY_METHOD_CLOSE)
public MongoClient mongo() throws IOException {
Net net = mongodProcess().getConfig().net();
mongoProperties.setHost(net.getServerAddress().getHostName());
mongoProperties.setPort(net.getPort());
return mongoProperties.createMongoClient(this.mongoClientOptions, environment);
}

@Bean(destroyMethod = DESTROY_METHOD_STOP)
public MongodProcess mongodProcess() throws IOException {
return mongodExecutable().start();
}

@Bean(destroyMethod = DESTROY_METHOD_STOP)
public MongodExecutable mongodExecutable() throws IOException {
return mongodStarter().prepare(mongodConfig());
}

@Bean
public IMongodConfig mongodConfig() throws IOException {
return new MongodConfigBuilder().version(Version.Main.PRODUCTION).build();
}

@Bean
public MongodStarter mongodStarter() {
Command command = Command.MongoD;
IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder()
.defaultsWithLogger(command, LOGGER)
.artifactStore(new ExtractedArtifactStoreBuilder()
.defaults(command)
.download(new DownloadConfigBuilder()
.defaultsForCommand(command).build())
.executableNaming(new UserTempNaming()))
.build();

return MongodStarter.getInstance(runtimeConfig);
}

在该类(class)中,它非常标准,只是遵循fladoodle的示例。

95% 的情况下这效果很好,我的所有测试都通过了。一些随机测试间歇性地失败,例如当我做这样的事情时:

userRepository.customMethodPushToList(user.getId(), aString);
user = userRepository.findOne(user.getId());
assertEquals(2, user.getSomeList().size());

customMethodPushToList 所做的就是将字符串推送到数据库中 User 条目中的列表。这里没什么特别的。然而,测试失败的概率为 5%。

认为这是因为与写关注有关......即我在更新对象之前检索了该对象。

提前致谢。

编辑

在海报回答后,我手动创建了 MongoClientOperations:

MongoClientOptions mongoClientOptions = MongoClientOptions.builder().writeConcern(WriteConcern.ACKNOWLEDGED).build();

到目前为止一切顺利...

最佳答案

关于java - 如何为嵌入式mongo(flapdoodle)全局设置WriteConcern以修复间歇性测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37772389/

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