Я создаю приложение Spring Boot REST для существующей базы данных Oracle, и из-за множества факторов я вынужден использовать JdbcTemplate вместо JPA.Я пытаюсь использовать базу данных H2 в памяти для модульных тестов, но у меня возникают трудности с ее настройкой.
Код приложения компилируется и работает нормально, успешно подключаясь (и возвращая результаты запросов из) от OracleдБ с использованием:
gradle clean bootRun -x test
Но когда я пытаюсь запустить только тесты:
gradle clean test
я получаю следующую ошибку:
org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [select * from schema_name.persons where id = ?]; nested exception is org.h2.jdbc.JdbcSQLException: Table "persons" not found; SQL statement: select * from schema_name.persons where id = ? [42102-192]
У меня есть приложение.properties для экземпляра prod, который выглядит следующим образом:
spring.datasource.url=jdcbc:oracle:thin:@(connection details...)
spring.datasource.username=(prod oracle db username)
spring.datasource.password=(prod oracle db password)
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
и application-test.properties, который выглядит следующим образом:
spring.datasource.url=jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS schema_name;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=Oracle
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
Spring Boot выбирает правильные атрибуты источника данных,поскольку он явно подключается к базе данных Oracle при исключении тестовых классов в bootRun и, наоборот, пытается подключиться к базе данных H2, когда я только пытаюсь запустить тесты.
Я думаю, что проблема связана со схемойи таблица комбинированная в H2 по сравнению с Oracle, но не может выяснить, где разъединение.Я добавил в
INIT=CREATE SCHEMA IF NOT EXISTS schema_name
, чтобы попытаться решить эту проблему, но, похоже, я получаю ту же ошибку в любом случае.Вот тестовый класс:
@RunWith(SpringRunner.class)
@SpringBootTest()
@ActiveProfiles("test")
public class PersonServiceTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Before
public void setup() throws ScriptException, SQLException {
ScriptUtils.executeSqlScript(jdbcTemplate.getDataSource().getConnection(),
new ClassPathResource("scripts/create/fake_persons.sql");
ScriptUtils.executeSqlScript(jdbcTemplate.getDataSource().getConnection(),
new ClassPathResource("scripts/insert/fake_persons.sql");
}
@After
public void teardown() throws ScriptException, SQLException {
ScriptUtils.executeSqlScript(jdbcTemplate.getDataSource().getConnection(),
new ClassPathResource("scripts/drop/fake_persons.sql");
}
@Autowired
private IPersonDao personDao;
private Person testPerson;
@Test
public void getPersonByIdTest(){
testPerson = personDao.getPersonById(1234);
assertEquals("Person named John should have been returned", true, testPerson.getFirstName() == "John");
}
}
Вот SQL, который я использую для создания таблицы:
create table schema_name.persons (
LASTNAME VARCHAR(25) NOT NULL,
FIRSTNAME VARCHAR(20) NOT NULL,
NOTES VARCHAR(100),
ID INT NOT NULL);
И вот как я его заполняю:
insert into schema_name.persons (
LASTNAME,FIRSTNAME,NOTES,ID
) values (
'Doe','John','Here are some notes about this person', 1234
);
Запрос (в классе Java PersonDao) для getPersonById:
Select * from schema_name.persons where id = ?
И успешно выполняется для базы данных Prod с использованием метода getJdbcTemplate (). QueryForObject ().Но я не могу обойти проблему схемы / таблицы при запуске ее с базой данных в памяти.