Java中的Mongodb单元测试

jopen 10年前

如何进行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"));
    }
}


其他:

https://github.com/fakemongo/fongo