Как получить доступ к таблице H2 в Spring @PostConstruct?

#java #spring

Вопрос:

Я определил базу данных H2 как базу данных-источник модульных тестов.

 <jdbc:embedded-database id="adminmaster" type="H2">
    <jdbc:script location="classpath:db/schemas.sql" encoding="UTF-8"/>
    <jdbc:script location="classpath:db/test_data.sql" encoding="UTF-8"/>
</jdbc:embedded-database>
 

И настройте пул соединений с источниками данных

 <bean id="adminDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.h2.Driver"/>
    <property name="url" value="jdbc:h2:mem:adminmaster;MODE=MYSQL;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1"/>
    <property name='username' value='sa'/>
    <property name='password' value=''/>
</bean>
 

Но проблема в том, что, когда я хочу запросить некоторые данные в таблице XXX, я получил:

Причина: org.h2.jdbc.JdbcSQLException: Таблица «XXX» не найдена; инструкция SQL:

   @PostConstruct
  public void init() {
    try {
      // here I tried to get data from database
    } catch (Exception e) {
      log.error("load db jar failed, error: {}", Throwables.getStackTraceAsString(e));
    }
 

Я обнаружил, что могу запрашивать данные в обычных методах @Test, но когда я попытался запустить весенний тест, метод @PostConstruct выдаст исключение.

Ответ №1:

Если вы пытаетесь получить доступ к данным из своей тестовой базы данных, в Junit 4 есть аннотации @Before (перед каждым тестом) и @BeforeClass (только один раз).

В Junit5 есть более явные аннотации : @beforeEach и @beforeAll

@PostConstruct гарантирует только правильную инициализацию вашего компонента со всеми зависимостями. Не то чтобы база данных была готова к использованию 😉

Если вы используете другую библиотеку тестов, посмотрите на эквивалентность. Но если вы используете Spring, вы, безусловно, используете Junit.

https://www.baeldung.com/junit-before-beforeclass-beforeeach-beforeall