2016-01-11 2 views
1

Я сделал некоторые исследования о том, как проверить мой DAO слой, используя HyperSQL и я нашел этот вопрос: https://softwareengineering.stackexchange.com/questions/219362/how-to-test-the-data-access-layerJUnit с помощью HyperSQL для тестирования классов DAO

Как импортировать DBConnection, потому что я попытался с помощью hypersql флягу и сделал не работа. В вопросе по ссылке я увидел это db.url=jdbc:hsqldb:file:src/test/resources/testData;shutdown=true;, но я не знаю, как его использовать.

+0

Как вы подключаетесь к своей базе данных? Hibernate? Обычный старый JDBC? Вы используете Spring? У вас есть строка подключения, поэтому при выполнении модульных тестов необходимо заменить строку подключения в реальном времени. – AndyN

+0

@ AndyN Я использую JDBC и Spring. – NoSuchUserException

ответ

1

Используя JDBC и Spring, в вашем приложении вы создадите объект DataSource и используете этот объект для создания объекта JdbcTemplate, который вы используете для запуска ваших запросов JDBC. Пример: this. Поэтому, чтобы использовать базу данных HSql, вам нужно будет изменить значения, используемые для настройки компонента DataSource, но только для ваших модульных тестов.

В зависимости от того, как вы используете Spring (аннотации, xml config), есть несколько способов сделать это. Вам нужно будет создать новый компонент конфигурации или файл конфигурации xml, а затем указать его в своих модульных тестах.

Для XML, скопировать над пружинной файл контекста XML, и изменить DataSource значения к чему-то вроде:

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> 
    <property name="url" value="jdbc:hsqldb:file:src/test/resources/testData;shutdown=true;"/> 
    <property name="username" value="SA"/> 
    <property name="password" value=""/> 

Затем вам нужно ссылаться на этот новый контекст конфигурации в тестовом модуле , Что-то вроде:

@RunWith(SpringJUnit4ClassRunner.class) 
// ApplicationContext will be loaded from "classpath:/test-config.xml" 
@ContextConfiguration("/test-config.xml") 
public class DAOTests { 
    @Autowired 
    private DatabaseDAO dao; 
} 

С аннотациями, вы должны будете сделать новый класс конфигурации (вы должны иметь один уже, класс помечается @Configuration) и возвращает соответствующий DataSource. Что-то вроде этого:

@Bean 
public DataSource hsqlDataSource(){ 
    return DataSourceBuilder 
     .create() 
     .driverClassName("org.hsql.jdbcDriver") 
     .url("jdbc:hsqldb:file:src/test/resources/testData;shutdown=true;") 
     .username("SA") 
     .password(""); 
     .build(); 
} 

Вы можете настроить профиль для конфигурации (с помощью @Profile("test") аннотацию), а затем указать, какой профиль вы хотите использовать в тестовом модуле (@ActiveProfiles("test")). Дополнительная информация here.

В качестве альтернативы вы можете использовать Spring EmbeddedDatabaseBuilder, если вы просто пытаетесь выполнить простой тест DAO. Есть учебник here. Он настраивает вас с помощью HSql в базе данных памяти (в отличие от файловой системы), что очень удобно для настройки/разрыва. Просто добавьте компонент в свой класс конфигурации, и ваш DAO должен забрать его, если Spring вводит вам DataSource. Пример ниже взят из here

@Bean 
public DataSource dataSource() { 

    // no need shutdown, EmbeddedDatabaseFactoryBean will take care of this 
    return new EmbeddedDatabaseBuilder() 
     .setType(EmbeddedDatabaseType.HSQL) 
     .addScript("db/setup_script.sql") 
     .build(); 
} 

Там немного, чтобы пружинные управление конфигурацией. В этом ответе я не очень подробно рассказывал об этом, но посмотрите несколько примеров, и это начнет иметь смысл.

+0

** http: //www.mkyong.com/spring/spring-embedded-database-examples/*** это учебник для теста интеграции. Я пытаюсь выполнить единичный тест. – NoSuchUserException

+1

С базой данных HSql, общающейся с вашим DAO? Это небольшой интеграционный тест. Если вы проводите единичный тест своего DAO, вы просто издеваетесь над JDBCTemplate или DataSource, и вам не нужно будет определять, где определен URL вашей базы данных. – AndyN

+0

Не могли бы вы привести мне пример, как это сделать? если вы согласны, используйте пример из ссылки. – NoSuchUserException