Нет, все верно было сказано в видео :) Все статические поля инициализируются при первом использовании методов/полей этого класса, именно в этот момент происходит загрузка класса в память с помощью загрузчика классов (class loader). Это сделано с целью уменьшить время старта Java приложений (в больших проектах классов десятки тысяч). Своего рода - это lazy loading. Вы можете это проверить сами, просто расставив точки остановки (breakpoints) в нужных местах и запустив программу в режиме отладки (debug).
@@dmdev а, вы смысле при загрузке класса - тогда да. А то я поняла как при первом обращении к этой самой статической переменной (а не при первом обращении к любой переменной или методу).
Почему то, в class Postgres не видно класс PostgreSQLContainer несмотря на то, что testcontainers нормально инициализировался , приедлагает добавить либу в classpathно не добавляет
Я думаю был неправ, тк по невнимательности создал class Postgres в src, а потом я узрел его в test и все сошлось, но увидел, что версия докер контейнера который устанавоивали и тот кого прописывали в интеграционном тесте тоже отличаются, по итогу testconteiner не стартует ( Единственный урок сначала курса по spring-boot который не удалось пройти, а так ваши видео очень акутальный и просты для понимания, после них хочется разбираться дальше... Прошк не забрасывайте тему Spring-boot. Спасибо!!!
у меня без следующих настроек контейнера почему то не заработало: .withDatabaseName("home_db") .withUsername("postgres") .withPassword("postgres") .withExposedPorts(5432) .withCreateContainerCmdModifier(cmd -> { cmd .withHostName("localhost") .withPortBindings(new PortBinding(Ports.Binding.bindPort(5432), new ExposedPort(5432))); });
Ты точно использовал все те же версии докер контейнеров и библиотек? Ибо твои настройки - это переписывание дефолтных, которые ты можешь увидеть, просто зайдя в класс PostgreSQLContainer.
@@dmdev проблему решил без куска кода выше, ошибка была в том, что один из тестов использовал liquibase-пропертя из application.properties, которые имели другие port, user и password. Проблему решил добавив наследование от IntegrationTestBase а так же пришлось переопределять эти пропертя в методе iinitialize(). TestPropertyValues.of( "spring.datasource.url=" + container.getJdbcUrl(), "spring.datasource.username=" + container.getUsername(), "spring.datasource.password=" + container.getPassword(), "spring.liquibase.url=" + container.getJdbcUrl(), "spring.liquibase.user=" + container.getUsername(), "spring.liquibase.password=" + container.getPassword() ).applyTo(applicationContext);
10 тысяч лайков! Спасибо
Всегда пожалуйста! Рад, что смотрите мой канал :)
Спасибо большое, теперь один всем известный проект будет покрыт тестами))
Это это проект такой всем известный?)
Большое спасибо за помощь! Вы меня спасли)
Подскажите, как настроить разноцветные скобки?
Всегда пожалуйста)
Про скобки и прочее я рассказывал в level 1 плейлисте:
Java для начинающих. 5.2 Полезные возможности Intellij IDEA
Для использования testcontainers вместе с junit5 удобнее задействовать зависимость org.testcontainers:junit-jupiter
Спасибо, не использовал ее. А в чем удобство?
Спасибо!
Советую проходить мои курсы по порядку, согласно Java Roadmap (ссылка есть под каждым видео taplink)
Здорово)
Рад, что вам понравилось
Спасибо!
(Замечу, что статическая переменная инициализируется не при первом обращении, а при создании класса Postgres, еще до instance-переменных).
Нет, все верно было сказано в видео :)
Все статические поля инициализируются при первом использовании методов/полей этого класса, именно в этот момент происходит загрузка класса в память с помощью загрузчика классов (class loader). Это сделано с целью уменьшить время старта Java приложений (в больших проектах классов десятки тысяч). Своего рода - это lazy loading.
Вы можете это проверить сами, просто расставив точки остановки (breakpoints) в нужных местах и запустив программу в режиме отладки (debug).
@@dmdev а, вы смысле при загрузке класса - тогда да. А то я поняла как при первом обращении к этой самой статической переменной (а не при первом обращении к любой переменной или методу).
А в этом классе всего одно единственное статическое поле)
Почему то, в class Postgres не видно класс PostgreSQLContainer несмотря на то, что testcontainers нормально инициализировался , приедлагает добавить либу в classpathно не добавляет
Gradle используете?
да удалось пофиксить, добавив доп строку compile для testcontainers
@@Papont
Я думаю был неправ, тк по невнимательности создал class Postgres в src, а потом я узрел его в test и все сошлось, но увидел, что версия докер контейнера который устанавоивали и тот кого прописывали в интеграционном тесте тоже отличаются, по итогу testconteiner не стартует (
Единственный урок сначала курса по spring-boot который не удалось пройти, а так ваши видео очень акутальный и просты для понимания, после них хочется разбираться дальше... Прошк не забрасывайте тему Spring-boot. Спасибо!!!
@@Papont Ну так версию ведь соблюдать надо. В чем ошибка сейчас?
у меня без следующих настроек контейнера почему то не заработало:
.withDatabaseName("home_db")
.withUsername("postgres")
.withPassword("postgres")
.withExposedPorts(5432)
.withCreateContainerCmdModifier(cmd -> {
cmd
.withHostName("localhost")
.withPortBindings(new PortBinding(Ports.Binding.bindPort(5432), new ExposedPort(5432)));
});
Ты точно использовал все те же версии докер контейнеров и библиотек?
Ибо твои настройки - это переписывание дефолтных, которые ты можешь увидеть, просто зайдя в класс PostgreSQLContainer.
@@dmdev проблему решил без куска кода выше, ошибка была в том, что один из тестов использовал liquibase-пропертя из application.properties, которые имели другие port, user и password.
Проблему решил добавив наследование от IntegrationTestBase а так же пришлось переопределять эти пропертя в методе iinitialize().
TestPropertyValues.of(
"spring.datasource.url=" + container.getJdbcUrl(),
"spring.datasource.username=" + container.getUsername(),
"spring.datasource.password=" + container.getPassword(),
"spring.liquibase.url=" + container.getJdbcUrl(),
"spring.liquibase.user=" + container.getUsername(),
"spring.liquibase.password=" + container.getPassword()
).applyTo(applicationContext);
Так ты использовал другую библиотеку с другими пропертями для коннекшена к базе. Поэтому да, проблема была в другом. Молодец, что разобрался!
Не поднимается контекст и сервис не автовайрится.
Значит что-то ты делаешь не так)