#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