Frage: Gibt es eine Möglichkeit, die Konfiguration für (Flapdoodle) Embedded Mongo zu ändern, damit ich Schreibvorgänge vor dem Lesen garantieren kann? Bitte beachten Sie, dass sich die Frage speziell auf die Implementierung von Flapdoodle und nicht auf MongoDB im Allgemeinen bezieht. Ich möchte dies nur in test und in config anwenden (wenn möglich), anstatt alle meine Mongo-Operationen durchzugehen und die Schreibprobleme überall zu stellen.Wie setze WriteConcern global für Embedded Mongo (Pattdoodle), um intermittierende Testfehler zu beheben
Einzelheiten
Ich verwende Spring + eingebettet Mongo in meiner Testumgebung. Maven Abhängigkeit sieht wie folgt aus:
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>1.50.1</version>
<scope>test</scope>
</dependency>
Mit einem Testkonfigurationsklasse:
@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);
}
In dieser Klasse seine ziemlich Standard, nur folgende flapdoodle der Beispiele.
95% der Zeit funktioniert das großartig, alle meine Tests bestehen. Zwischenzeitlich versagen einige zufällige Tests, z. wenn ich so etwas tun:
userRepository.customMethodPushToList(user.getId(), aString);
user = userRepository.findOne(user.getId());
assertEquals(2, user.getSomeList().size());
Alle customMethodPushToList
tut, ist eine Zeichenfolge in einer Liste im User
Eintrag in der Datenbank schieben. Nichts besonderes hier. In 5% der Fälle schlägt der Test jedoch fehl.
Ich denke, es ist, weil etwas mit Schreiben zu tun betrifft ... d. H. Ich habe das Objekt abgerufen, bevor es aktualisiert wurde.
Vielen Dank im Voraus.
EDIT
Nach Antwort von einem Plakat, ich MongoClientOperations
manuell erstellt haben:
MongoClientOptions mongoClientOptions = MongoClientOptions.builder().writeConcern(WriteConcern.ACKNOWLEDGED).build();
So weit so gut ...
verwenden Sie die eingebettete Mongo oder Real Mongo Instanz zum Testen? Ich habe ein Problem mit verdeckt Mongo es war die reale Monogo-Instanz. danke im voraus. – devanathan
@devanathan nein es gab keine andere Instanz von Mongo –