2016-06-12 8 views
1

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 ...

+0

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

+0

@devanathan nein es gab keine andere Instanz von Mongo –

Antwort

1
+0

Danke, aber es ist nicht klar, wie bekomme ich einen Verweis auf die DB selbst von der 'TestConfig'?'MongoClientOptions' scheint unveränderbar zu sein, ansonsten hat das eine 'WriteConcern'-Option –

+1

Anstatt MongoClientOptions zu autowirten, habe ich' MongoClientOptions mongoClientOptions = MongoClientOptions.builder(). WriteConcern (WriteConcern.ACKNOWLEDGED) .build(); ' –

+1

@ user2393012 gesetzt Wenn Sie immer noch '@ Autowired' verwenden möchten, können Sie eine Methode mit' @ Bean'-Annotation verwenden, die die 'MongoClientOptions' erzeugt. – selalerer