Spring Boot Oracle Rest JdbcTemplate Gradle приложение с оперативной памятью H2 для модульных тестов - PullRequest
0 голосов
/ 26 декабря 2018

Я создаю приложение 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 ().Но я не могу обойти проблему схемы / таблицы при запуске ее с базой данных в памяти.

...