Запустите MongoDB с Maven - PullRequest
       6

Запустите MongoDB с Maven

11 голосов
/ 06 июля 2010

Я использую драйвер MongoDB Java для выполнения некоторого сохранения в моем приложении.Сборка для моего приложения управляется через Maven, и я ищу лучший способ интегрировать серию модульных тестов, связанных с MongoDB, в процесс сборки Maven.Я не могу предположить, что пользователь, создавший приложение, установил dameon MongoDB в качестве службы и поэтому должен запустить демон до выполнения связанных модульных тестов.ресурсную папку тестового каталога (например, src / test / resources) и запустите демон, используя Runtime.exec ().Есть ли подход, который чище?Я чувствую, что Runtime.exec () - это быстрый и грязный способ заставить что-то работать, но не самый идеальный ... Мне нужно, чтобы он работал как на Linux, так и на Windows.

Ответы [ 3 ]

7 голосов
/ 06 июня 2012

Я создал плагин Maven, который упаковывает API-интерфейс flapdoodle.de 'embedded mongo' :

embedmongo-Maven-плагин

Это обеспечивает цель start, которую можно использовать для запуска любой версии MongoDB, которую вы хотите (например, во время pre-integration-test), и цель stop, которая остановит MongoDB (например, во время post-integration-test).

Двоичные файлы MongoDB загружаются и сохраняются в ~/.embedmongo для будущих сборок.

4 голосов
/ 21 января 2011

У моей команды была точно такая же проблема, но мы не могли найти какой-либо чистый способ ее решения.Мы даже пошли по неверному пути использования плагина ant-run для выполнения некоторых задач Ant (независимо от ОС), которые при необходимости запускали бы демон MongoDB.В итоге мы отказались от всего этого в пользу класса AbstractMongoDbTest, который в своем методе @Before утверждает, что MongoDB запущен, и, если нет, не проходит тест с очень конкретным сообщением, побуждающим пользователя запустить Mongo.Это не идеально, но, к сожалению, если вы вводите внешнюю зависимость в свои модульные тесты, они больше не являются модульными тестами, это интеграционные тесты, и вполне разумно требовать, чтобы люди имели доступную зависимость.

Другие параметры:

Если все разработчики находятся в одной сети, вы можете настроить выделенный экземпляр MongoDB на сервере и сделать так, чтобы все тесты указывали на его имя хоста вместо localhost (по умолчанию).

Вы также можете абстрагировать все взаимодействия с MongoDB за интерфейсами с репозиторием и реализациями MongoDB.В любом случае, это хорошая идея.Это позволит вашим тестам либо макетировать интерфейсы репо, либо создавать заглушки сервисов.Это не позволит вашим модульным тестам стать интеграционными тестами.Это также имеет то преимущество, что если вы когда-нибудь решите перейти от MongoDB к CouchDB или даже к реляционной базе данных, такой как Oracle, ваши тесты не нужно менять, вам просто нужно создавать новые реализации интерфейсов репо.

0 голосов
/ 13 апреля 2013

Хотя @joelittlejohn ответ об использовании плагина embedmongo будет работать.Вы можете использовать его непосредственно в своих модульных тестах для создания небольших контролируемых тестов.

public class MongoDbTest {
    private static MongodForTestsFactory testsFactory;

    @BeforeClass
    public static void setMongoDB() throws IOException {
        testsFactory = MongodForTestsFactory.with(Version.Main.PRODUCTION);
    }

    @AfterClass
    public static void tearDownMongoDB() throws Exception {
        testsFactory.shutdown();
    }

    private DB db;

    @Before
    public void setUpMongoDB() throws Exception {
        final Mongo mongo = testsFactory.newMongo();
        db = testsFactory.newDB(mongo);
    }

    @Test
    public void testDatabaseCreated() {
        assertNotNull(db);
    }
}

Я фактически задокументировал полное объяснение этого здесь (это будет слишком многословно, чтобы поместить его в stackoverflow): http://www.trajano.net/2012/06/mongodb-with-maven/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...