Иероглифы/Каракули/Крокозябры вместо русских букв при использовании "testcontainers:postgresql"
При вызове теста, используя "org.testcontainers:postgresql" который поднимает базу через liquibase, английские буквы выдает нормально, но русские в таком виде:
Actual :Book(id=1, name=Капитанская дочка, image=null, author=А.С.Пушкин...
Сам тест:
import lombok.RequiredArgsConstructor;
import org.andrey.database.entity.Book;
import org.andrey.database.repository.BookRepository;
import org.andrey.integration.service.IntegrationTestBase;
import org.junit.jupiter.api.Test;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.*;
@RequiredArgsConstructor
class BookRepositoryTest extends IntegrationTestBase {
private final BookRepository bookRepository;
@Test
void checkFindById() {
Book expectedBook = Book.builder()
.id(1L)
.name("Капитанская дочка")
.author("А.С.Пушкин")
.genre("Роман")
.yearOfPublish(1836)
.pages(320)
.pricePaper(500)
.priceDigital(300)
.inStock(18)
.build();
Optional<Book> optionalBook = bookRepository.findById(1L);
assertTrue(optionalBook.isPresent());
System.out.println(optionalBook.get().getAuthor());
optionalBook.ifPresent(book -> assertEquals(expectedBook, book));
}
}
Место запуска контейнера:
import org.andrey.integration.annotation.IT;
import org.junit.jupiter.api.BeforeAll;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.springframework.test.context.jdbc.Sql;
import org.testcontainers.containers.PostgreSQLContainer;
@IT
@Sql({
"classpath:sql/data.sql"
})
public abstract class IntegrationTestBase {
private static final PostgreSQLContainer<?> container = new PostgreSQLContainer<>("postgres:16.2");
@BeforeAll
static void runContainer() {
container
// .withEnv("LANG", "ru_RU.UTF-8")
// .withEnv("LANGUAGE", "ru_RU:ru")
// .withEnv("LC_LANG", "ru_RU.UTF-8")
// .withEnv("LC_ALL", "ru_RU.UTF-8")
.start();
}
@DynamicPropertySource
static void postgresProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", container::getJdbcUrl);
}
}
Попытался задать русскую кодировку при старте контейнера, но выдает другую ошибку:
org.testcontainers.containers.ContainerLaunchException: Timed out waiting for log output matching '.*database system is ready to accept connections.*\s'
Контейнеры поднимаются успешно:
Inspect тестового контейнера:
"Env": [
"POSTGRES_USER=test",
"POSTGRES_PASSWORD=test",
"POSTGRES_DB=test",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/16/bin",
"GOSU_VERSION=1.17",
"LANG=en_US.utf8",
"PG_MAJOR=16",
"PG_VERSION=16.2-1.pgdg120+2",
"PGDATA=/var/lib/postgresql/data"
],
"Cmd": [
"postgres",
"-c",
"fsync=off"
]
В основной бд русский текст в таблицах отображается корректно, хотя там тоже стоит "LANG=en_US.utf8".
build.gradle:
`plugins {
id 'java'
id 'org.springframework.boot' version '3.2.4'
id 'io.freefair.lombok' version '8.6'
}
apply plugin: 'io.spring.dependency-management'
apply from: 'version.gradle'
group = 'org.andrey'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.postgresql:postgresql'
implementation 'org.liquibase:liquibase-core'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation "org.testcontainers:postgresql:${versions.testcontainers}"
}
test {
useJUnitPlatform()
}
wrapper {
gradleVersion '7.6'
}`