#sql #spring-boot #is-empty #testcontainers
Вопрос:
Я использую Testcontainers 1.15.2 (используя изображение postgres 13.2-alpine) с загрузкой Spring 2.4.3. Testcontainer запускается с помощью сценария инициализации, который начинается с определения типа, создания таблицы и вставки в нее значений. Я даже выполнил a COMMIT;
в конце, но не определил схему или что-то в этом роде. Когда я запускаю приложение Spring Boot, вывод консоли показывает мне, что сценарий инициализации был успешно выполнен. Когда я выполняю ВЫБОР * ИЗ результата, он пуст. Итак…почему таблицы postgresql пусты, хотя я вставлял их раньше?
CREATE TYPE Erklaerungstyp AS ENUM ('AAAAA', 'BBBBB', 'CCCCC', 'DDDDD');
CREATE TYPE Geschlecht AS ENUM ('D', 'F', 'M');
DROP TABLE IF EXISTS Anschrift;
CREATE TABLE Anschrift (
a_id SERIAL PRIMARY KEY,
Zusatz VARCHAR(255),
Strasse VARCHAR(30) NOT NULL,
Hausnummer VARCHAR(30) NOT NULL,
plz VARCHAR(5) NOT NULL,
Ort VARCHAR(80) NOT NULL,
Bundesland VARCHAR(20),
Land VARCHAR(20) NOT NULL,
create_Date DATE NOT NULL,
modify_Date DATE
);
INSERT INTO Anschrift VALUES (1, null, 'Musterstrasse', '13M', '12345', 'Berlin', 'Berlin', 'Deutschland', '2001-09-28');
INSERT INTO Anschrift VALUES (2, 'bei Müller', 'Musterweg', '1-3', '54321', 'Musterhausen', 'Muster-Hausen', 'Deutschland', '2002-03-11');
DROP TABLE IF EXISTS Person;
CREATE TABLE Person (
ep_id SERIAL PRIMARY KEY,
Geschlecht Geschlecht,
Vorname VARCHAR(30) NOT NULL,
Familienname VARCHAR(30) NOT NULL,
Geburtsname VARCHAR(30) NOT NULL,
Titel VARCHAR(10),
Geburtsdatum Date NOT NULL,
Geburtsort VARCHAR(30),
Anschrift INTEGER REFERENCES Anschrift(a_id),
Email VARCHAR(80),
Telefon VARCHAR(20),
Versichertennummer VARCHAR(15) NOT NULL,
create_Date DATE NOT NULL,
modify_Date DATE
);
INSERT INTO Person VALUES (1, 'M', 'Max', 'Mustermann', 'Mustermann', 'Dipl.-Inf.', '01.01.1901', 'Berlin', 1, 'Max.Mustermann@max.de',
'0111 12 34 56 789', 'X000Y111Z999', '2001-09-28');
COMMIT;
Я создаю экземпляр Testcontainer в абстрактном суперклассе для тестов, которые будут использоваться во всех наследующих тестах подклассов:
@ActiveProfiles("test")
@Testcontainers
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public abstract class AbstractApplicationIT {
final static DockerImageName POSTGRES_IMAGE = DockerImageName.parse("postgres:13.2-alpine");
@Container
public static PostgreSQLContainer<?> postgreSQLContainer = new PostgreSQLContainer<>(POSTGRES_IMAGE);
@Test
public void contextLoads() {
}
}
В подклассе я делаю:
@Transactional
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class XxxIT extends AbstractApplicationIT {
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.dbname}")
private String dbName;
@Value("${spring.datasource.initScript}")
private String initScript;
@Autowired
private AnschriftJpaDao dao;
@Autowired
private XxxService xxxService;
@BeforeAll
public void setup() {
postgreSQLContainer = new PostgreSQLContainer<>(POSTGRES_IMAGE)
.withDatabaseName(dbName)
.withUsername(username)
.withPassword(password)
.withInitScript(initScript);
postgreSQLContainer.start();
}
@Test
public void checkDbContainerIsAlive() {
assertThat(this.dao.findAll()).isNotNull();
}
}
…и тест зеленый, но когда я это делаю
@Test
public void anschrift_can_be_found() {
assertThat(this.dao.findAll().size() == 1);
List<Anschrift> anschriftList = this.dao.findAll();
System.out.println(anschriftList.size());
}
…тест зеленый, но anschriftList
пустой. Почему?
И если я использую Anschriften PK как частное лицо FK…Я получаю исключение LazyLoadingException, хотя и указываю fetch = FetchType.EAGER
в определениях отношений. Почему?
Ответ №1:
В моем приложении-тест.yaml я определил
jpa:
hibernate:
ddl-auto: create-drop
как я нашел это в Интернете.
-> Вывод этой строки приводит к заполненным таблицам.