Могу ли я использовать HSQLDB для junit-тестирования клонирования базы данных mySQL?

Я работаю над весенним проектом веб-потока и думаю, могу ли я использовать HSQLDB, а не mysql для тестирования junit?

Как я могу клонировать мою базу данных mysql в HSQLDB


person techsjs2013    schedule 30.01.2013    source источник
comment
Вы используете весну и спящий режим? Также добавьте, какая версия spring.   -  person Manuel Quinones    schedule 30.01.2013
comment
да .. Я использую Spring и Hibernate   -  person techsjs2013    schedule 30.01.2013


Ответы (2)


Если вы используете пружину 3.1 или выше, вы можете использовать профили пружины для достижения этой цели. Профиль по умолчанию загружается, если не установлен активный профиль.

<beans profile="dev">
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close"> 
        <property name="driverClass" value="org.hsqldb.jdbcDriver" />
        ...other datasource properties also create or drop db
    </bean>
</beans>
<beans profile="default">
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close"> 
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        ...other datasource properties
    </bean>
</beans>

В вашем модульном тесте установите активный профиль, добавив аннотацию.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:app-config.xml")
@ActiveProfiles("dev")
public class TransferServiceTest {
person Manuel Quinones    schedule 30.01.2013

Помимо предложений, примите во внимание, что в зависимости от ваших потребностей HSQL и MySQL не имеют таких функций, как соединения слиянием и другие нестандартные функции SQL. Из-за этого (в нашем случае) мы всегда запускаем наши тесты через встроенный Mysql.

Встроенная версия MySQL поставляется с файлом mysql-connector-mxj. Если вы используете Maven, вы можете получить это так:

<dependency>
   <groupId>mysql</groupId>
       <artifactId>mysql-connector-mxj</artifactId>
       <version>5.0.12</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-mxj-db-files</artifactId>
        <version>5.0.12</version>
</dependency>

Как только драйвер окажется на пути вашего проекта, вы можете просто запустить базу данных из Java. В нашем случае у нас есть этот служебный класс, который запускает базу данных:

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mysql.management.MysqldResource;
import com.mysql.management.MysqldResourceI;

public class EmbeddedMySQLDb {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    private MysqldResource mysqldResource;
    private String baseDatabaseDir = System.getProperty("java.io.tmpdir");
    private String databaseName = "test_db_" + System.nanoTime();
    private int port = 13306;
    private String username = "root";
    private String password = "password";

    /**
     * Starts the mysql database
     * @return
     */
    public void startDatabase() {
        if (logger.isDebugEnabled()) {
            logger.debug("=============== Starting Embedded MySQL using these parameters ===============");
            logger.debug("baseDatabaseDir : " + baseDatabaseDir);
            logger.debug("databaseName : " + databaseName);
            logger.debug("host : localhost (hardcoded)");
            logger.debug("port : " + port);
            logger.debug("username : " + username);
            logger.debug("password : " + password);
            logger.debug("=============================================================================");
        }

        File databaseDir = new File(new File(baseDatabaseDir), databaseName);

        mysqldResource = new MysqldResource(databaseDir);

        Map<String, String> database_options = new HashMap<String, String>();
        database_options.put(MysqldResourceI.PORT, Integer.toString(port));
        database_options.put(MysqldResourceI.INITIALIZE_USER, "true");
        database_options.put(MysqldResourceI.INITIALIZE_USER_NAME, username);
        database_options.put(MysqldResourceI.INITIALIZE_PASSWORD, password);

        mysqldResource.start("embedded-mysqld-thread-" + System.currentTimeMillis(), 
                             database_options);

        if (!mysqldResource.isRunning()) {
            throw new RuntimeException("MySQL did not start.");
        }

        logger.info("MySQL started successfully @ " + System.currentTimeMillis());


    }

    /**
     * Shutdowns the mysql database
     * @return
     */
    public void shutdownDatabase() {
        mysqldResource.shutdown();
        if (mysqldResource.isRunning() == false) {
            logger.info(">>>>>>>>>> DELETING MYSQL BASE DIR [" + mysqldResource.getBaseDir() + "] <<<<<<<<<<");
            try {
                FileUtils.forceDelete(mysqldResource.getBaseDir());
            } catch (IOException e) {
                logger.error(e.getMessage(), e);
            }
        }
    }



    //-------------------------------------------------------------------------
    /**
     * @return the baseDatabaseDir
     */
    public final String getBaseDatabaseDir() {
        return baseDatabaseDir;
    }

    /**
     * @param baseDatabaseDir the baseDatabaseDir to set
     */
    public final void setBaseDatabaseDir(String baseDatabaseDir) {
        this.baseDatabaseDir = baseDatabaseDir;
    }

    /**
     * @return the databaseName
     */
    public final String getDatabaseName() {
        return databaseName;
    }

    /**
     * @param databaseName the databaseName to set
     */
    public final void setDatabaseName(String databaseName) {
        this.databaseName = databaseName;
    }

    /**
     * @return the port
     */
    public final int getPort() {
        return port;
    }

    /**
     * @param port the port to set
     */
    public final void setPort(int port) {
        this.port = port;
    }

    /**
     * @return the username
     */
    public final String getUsername() {
        return username;
    }

    /**
     * @param username the username to set
     */
    public final void setUsername(String username) {
        this.username = username;
    }

    /**
     * @return the password
     */
    public final String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public final void setPassword(String password) {
        this.password = password;
    }   
}

Чтобы подключиться к БД после создания, вам нужно просто использовать в качестве URL-адреса БД что-то вроде этого:

String url = "jdbc:mysql:mxj://localhost:" + port + "/" + dbName;

С уважением,

person Dani C.    schedule 08.02.2013