Spring 2.7.14
(de.flapdoodle.embed.mongo.version=3.5.4)
/**
* Embedded MongoDB singleton.
* Add @Import(EmbeddedMongoDb.class) to Test* classes
*/
public class EmbeddedMongoDb implements Closeable {
private static final String CONNECTION_STRING = "mongodb://%s:%d";
private static MongoClient create;
private static MongodExecutable mongodExecutable;
private static MongoTemplate mongoTemplate;
@Bean
public MongoTemplate mongoTemplate() throws Exception {
if (mongoTemplate == null) {
String ip = "localhost";
int port = 17027;
MongodConfig mongodConfig = ImmutableMongodConfig.builder()
.net(new Net(ip, port, Network.localhostIsIPv6()))
.version(Version.Main.V6_0).build();
MongodStarter starter = MongodStarter.getDefaultInstance();
mongodExecutable = starter.prepare(mongodConfig);
mongodExecutable.start();
create = MongoClients.create(String.format(CONNECTION_STRING, ip, port));
mongoTemplate = new MongoTemplate(create, "test");
}
return mongoTemplate;
}
@Override
public void close() throws IOException {
create.close();
mongodExecutable.stop();
mongoTemplate = null;
}
}
Spring +3.1.2
(de.flapdoodle.embed.mongo.version=4.7.1)
/**
* Embedded MongoDB singleton.
* Add @Import(EmbeddedMongoDb.class) to Test* classes
*/
public class EmbeddedMongoDb implements Closeable {
private static final String CONNECTION_STRING = "mongodb://%s:%d";
private static ReachedState<RunningMongodProcess> mongod;
private static MongoClient client;
private static MongoTemplate mongoTemplate;
@Bean
public MongoTemplate mongoTemplate() throws Exception {
if (mongoTemplate == null) {
int port = 17027;
//Store database in temp folder
//More info: https://stackoverflow.com/a/1924576/3710490
String tmpdir = System.getProperty("java.io.tmpdir");
File databaseDir = new File(tmpdir, "database");
if(!databaseDir.exists()) {
Files.createDirectory(databaseDir.toPath());
}
ImmutableMongod mongodWithoutAuth = Mongod.builder()
.net(Start.to(Net.class).initializedWith(Net.defaults().withPort(port)))
.databaseDir(Start.to(DatabaseDir.class).initializedWith(DatabaseDir.of(databaseDir.toPath()))).build();
mongod = mongodWithoutAuth.start(Version.Main.V6_0);
ServerAddress address = mongod.current().getServerAddress();
client = MongoClients.create(String.format(CONNECTION_STRING, address.getHost(), address.getPort()));
mongoTemplate = new MongoTemplate(client, "test");
}
return mongoTemplate;
}
@Override
public void close() throws IOException {
if (mongod.current().isAlive()) {
client.close();
mongod.current().stop();
mongoTemplate = null;
}
}
}
Testing
@SpringBootTest(classes = {
Target.class // Instantiate only the necessary classes
})
@Import(EmbeddedMongoDb.class)
class TargetClassTest {
@Autowired
private MongoTemplate mongoTemplate;
@BeforeEach
void init() throws IOException {
//Drop all collections
mongoTemplate.getCollectionNames().forEach(mongoTemplate::dropCollection);
}
@Test
void testSomeMethod() throws IOException {
//WHEN
String collection = "some_collection";
Document doc = new Document("field", "value1");
Document doc2 = new Document("field", "value2");
Document doc3 = new Document("field", "value3");
//THEN
mongoTemplate.insert(Arrays.asList(doc, doc2, doc3), collection);
//VERIFY
Assertions.assertTrue(mongoTemplate.collectionExists(collection), "Wrong result");
Assertions.assertEquals(3, mongoTemplate.count(new Query(), collection), "Wrong result");
Assertions.assertEquals(2, mongoTemplate.count(Query.query(Criteria.where("field").in(doc2.getString("field"), doc3.getString("field"))), collection), "Wrong result");
Assertions.assertEquals(1, mongoTemplate.count(Query.query(Criteria.where("field").gt(doc2.getString("field"))), collection), "Wrong result");
Assertions.assertEquals(0, mongoTemplate.count(Query.query(Criteria.where("field2").exists(Boolean.TRUE)), collection), "Wrong result");
}
}
Note: No need mongo-java-driver
dependency.