Я использую MongoDB, Java, JDO и Maven.
Я запустил простое основное приложение, которое хранит некоторые ненужные данные и извлекает их из mongodb, и все выглядит нормально, но я хочу начать писать правильные модульные тесты. Моделирование фактического взаимодействия с базой данных не кажется мне очень полезным, поэтому технически я хочу написать функциональные тесты, которые проверяют полное взаимодействие с базой данных.
Мой модульный тест настроен следующим образом:
static final Logger LOG = LoggerFactory.getLogger(DaoTest.class);
static final int PORT = 100001;
static Process mongod;
static PersistenceManagerFactory pmf;
// Class under test.
Dao dao;
@BeforeClass
public static void beforeAll() throws Exception {
File mongoDir = new File(
System.getProperty("java.io.tmpdir"),
"mongodb-" + System.currentTimeMillis());
mongoDir.deleteOnExit();
mongod = Runtime.getRuntime().exec(String.format(
"/bin/sh -c mongod --dbpath=%s --port=%d",
mongoDir.getAbsolutePath(),
PORT));
LOG.info("Mongodb using {} on port {}.", mongoDir.getAbsolutePath(), PORT);
Thread.sleep(1000);
pmf = JDOHelper.getPersistenceManagerFactory("mongodbtest");
LOG.info("DB connection URL: {}.", pmf.getConnectionURL());
}
@AfterClass
public static void afterAll() throws Exception {
mongod.destroy();
}
@Before
public void setUp() throws Exception {
dao = new Dao(pmf);
}
src/test/resources/META-INF/persistence.xml выглядит так:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence ...>
<persistence-unit name="mongodbtest">
<properties>
<property name="javax.jdo.PersistenceManagerFactoryClass"
value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" />
<property name="javax.jdo.option.ConnectionURL" value="mongodb://localhost:100001/contacts"/>
<property name="javax.jdo.option.RetainValues" value="true"/>
<property name="datanucleus.autoCreateSchema" value="true" />
<property name="datanucleus.validateTables" value="false" />
<property name="datanucleus.validateConstraints" value="false" />
<property name="datanucleus.storeManagerType" value="mongodb" />
</properties>
</persistence-unit>
</persistence>
И, наконец, я выполняю свой модульный тест с mvn clean test, и только он будет работать, пока я не добавлю фактический тест, который пытается сохранить данные. Я получаю следующую ошибку:
Mongodb using /var/folders/00/0l550000h01000cxqpysvccm002cmm/T/mongodb-1373820849219 on port 100001.
DB connection URL: mongodb://localhost:100001/contacts.
Jul 14, 2013 12:54:10 PM com.mongodb.DBTCPConnector initDirectConnection
WARNING: Exception executing isMaster command on localhost/127.0.0.1:27017
java.io.IOException: couldn't connect to [localhost/127.0.0.1:27017] bc:java.net.ConnectException: Connection refused
at com.mongodb.DBPort._open(DBPort.java:214)
at com.mongodb.DBPort.go(DBPort.java:107)
...
Jul 14, 2013 12:54:10 PM com.mongodb.DBTCPConnector initDirectConnection
WARNING: Exception executing isMaster command on localhost/127.0.0.1:27017
java.io.IOException: couldn't connect to [localhost/127.0.0.1:27017] bc:java.net.ConnectException: Connection refused
at com.mongodb.DBPort._open(DBPort.java:214)
at com.mongodb.DBPort.go(DBPort.java:107)
...
ul 14, 2013 12:54:10 PM com.mongodb.DBPortPool gotError
WARNING: emptying DBPortPool to localhost/127.0.0.1:27017 b/c of error
java.io.IOException: couldn't connect to [localhost/127.0.0.1:27017] bc:java.net.ConnectException: Connection refused
at com.mongodb.DBPort._open(DBPort.java:214)
at com.mongodb.DBPort.go(DBPort.java:107)
...
Jul 14, 2013 12:54:10 PM org.datanucleus.store.valuegenerator.AbstractGenerator obtainGenerationBlock
INFO: Error encountered allocating block of IDs : can't call something : localhost/127.0.0.1:27017//localhost:100001/contacts
127.0.0.1:27017 — это настройки mongodb по умолчанию, но я понятия не имею, почему он их использует. Я вижу, что он собирает конфигурации из моего файла persistence.xml, поэтому я сбит с толку. документы mongo говорят, что формат URL-адреса строки подключения:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
До сих пор я запускал это только через maven, потому что это только то, что я дошел до сих пор, но в конечном итоге у меня возникнет еще один вопрос: как запускать эти модульные тесты в Eclipse. Я предполагаю, что для запуска этих тестов в Eclipse должен произойти процесс улучшения байтового кода, и я не знаю, как это настроить.
Я предполагаю, что я не первый человек, который хочет сделать что-то подобное. Существуют ли какие-либо стандартные методы написания функциональных тестов базы данных на Java? Я все делаю неправильно?