Java中的Mongodb單元測試
如何進行Mongodb測試?
我們在java中使用Mongodb作為數據庫進行存儲的時候,怎么樣對于進行測試呢?一種可能直接的方式就是在setUp中getDB,然后在tearDown里面dropDatabase。這樣的方式相對來說比較慢。一種更好的方式就是使用fake的數據庫,比如embedded的Mongodb用于測試。http://xunitpatterns.com/Test%20Double.html
我們這里使用的是https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo
引入依賴
build.gradle
dependencies {
compile "org.mongodb:mongo-java-driver:2.12.2"
testCompile "junit:junit:4.11"
testCompile "de.flapdoodle.embed:de.flapdoodle.embed.mongo:1.46.0"
}
腳手架MongodbBaseTest
編寫一個MongoBaseTest,這樣所有需要Mongo的測試,可以繼承這個類,就可以獲取db了。
public class MongodbBaseTest {
private static final MongodStarter starter = MongodStarter.getDefaultInstance();
protected MongoClient mongo;
protected DB db;
private MongodExecutable mongodExecutable;
private MongodProcess mongod;
@Before
public void setUp() throws Exception {
mongodExecutable = starter.prepare(new MongodConfigBuilder()
.version(Version.Main.PRODUCTION)
.net(new Net(12345, Network.localhostIsIPv6())).build());
mongod = mongodExecutable.start();
mongo = new MongoClient("localhost", 12345);
db = mongo.getDB("embedded-mongo");
}
@After
public void tearDown() throws Exception {
mongod.stop();
mongodExecutable.stop();
}
}
編寫UserTest
public class UserTest extends MongodbBaseTest {
private DBCollection users;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
users = db.getCollection("users");
}
@Test
public void should_insert_and_get_user() {
final DBObject userDocument = new BasicDBObjectBuilder()
.add("name", "kiwi")
.get();
users.insert(userDocument);
final DBObject userDocumentFromDb = users.findOne(new BasicDBObject("_id", userDocument.get("_id")));
assertThat(userDocumentFromDb.get("name"), is("kiwi"));
}
}
其他: