Spring Boot: если в коде используется RestTemplate, тесты можно писать, подменяя внешние HTTP-вызовы с помощью MockRestServiceServer.
✅ MockRestServiceServer работает за счет перехвата HTTP-запросов.
Дан сервис, который дергает внешний API:
Тест можно реализовать так:
👉 Java Portal
Дан сервис, который дергает внешний API:
@Service
public class ProductService {
private final RestTemplate restTemplate;
public ProductService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String getProductName(long id) {
Product product = restTemplate.getForObject(
"https://remoteapi.com/products/{id}",
Product.class,
id
);
return product.getName();
}
}
Тест можно реализовать так:
@SpringBootTest
class ProductServiceTest {
@Autowired
private RestTemplate restTemplate;
@Autowired
private ProductService productService;
private MockRestServiceServer mockServer;
@BeforeEach
void setup() {
mockServer = MockRestServiceServer.createServer(restTemplate);
}
@Test
void shouldReturnProductWhenExternalApiCalled() {
// Arrange
mockServer.expect(requestTo("https://remoteapi.com/products/1"))
.andExpect(method(HttpMethod.GET))
.andRespond(withSuccess(
"{\"id\":1,\"name\":\"USB stick\"}",
MediaType.APPLICATION_JSON
));
// Act
ProductDto product = productService.getProduct(1L);
// Assert
assertThat(product.getName()).isEqualTo("USB stick");
mockServer.verify();
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4🔥2😁2
Нашли офигенный способ выучить PostgreSQL в браузере : crunchydata
PostgreSQL-песочница с практическими уроками SQL, транзакциям, индексам, PostGIS и не только
🛌
👉 Java Portal
PostgreSQL-песочница с практическими уроками SQL, транзакциям, индексам, PostGIS и не только
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2😁1
Java: не пихай бизнес-логику в Stream.peek(). Используй его только для отладки.
Смысл простой: peek() предназначен для легкого дебага и просмотра потока, а не для вычислений или побочных эффектов.
Используй только для легкой отладки
Пример: просмотр (инспекция) потока пайплайна
👉 Java Portal
Смысл простой: peek() предназначен для легкого дебага и просмотра потока, а не для вычислений или побочных эффектов.
Используй только для легкой отладки
Пример: просмотр (инспекция) потока пайплайна
list.stream()
.filter(x -> x > 10)
.peek(x -> System.out.println("Filter: " + x))
.map(x -> x * 2)
.peek(x -> System.out.println("Map: " + x))
.toList();
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4
Выбирай направление:
Промпты, обучение, шпаргалки и полезные ресурсы на каждую тему!
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚2🔥1
Под капотом многопоточной синхронизации в Java: как потоки договариваются через Mark Word
Синхронизация в Java часто воспринимается как простая языковая конструкция — достаточно использовать ключевое слово synchronized, и код начинает «просто работать».
На практике же на уровне JVM происходит цепочка событий, которую можно проследить до Mark Word — восьмибайтового служебного поля заголовка каждого Java-объекта.
Современные JVM (HotSpot, OpenJ9, GraalVM) не используют фиксированную модель блокировок. Вместо этого они динамически выбирают стратегию синхронизации, исходя из реального поведения потоков и истории использования объекта.
Эта статья предназначена для Java‑разработчиков, которые уже знакомы с многопоточностью и synchronized, но хотят разобраться, как именно JVM управляет блокировками, какие состояния проходит объект и какую роль в этом играет Mark Word.
👉 Java Portal
Синхронизация в Java часто воспринимается как простая языковая конструкция — достаточно использовать ключевое слово synchronized, и код начинает «просто работать».
На практике же на уровне JVM происходит цепочка событий, которую можно проследить до Mark Word — восьмибайтового служебного поля заголовка каждого Java-объекта.
Современные JVM (HotSpot, OpenJ9, GraalVM) не используют фиксированную модель блокировок. Вместо этого они динамически выбирают стратегию синхронизации, исходя из реального поведения потоков и истории использования объекта.
Эта статья предназначена для Java‑разработчиков, которые уже знакомы с многопоточностью и synchronized, но хотят разобраться, как именно JVM управляет блокировками, какие состояния проходит объект и какую роль в этом играет Mark Word.
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Под капотом многопоточной синхронизации в Java: как потоки договариваются через Mark Word
Синхронизация в Java часто воспринимается как простая языковая конструкция — достаточно использовать ключевое слово synchronized , и код начинает «просто работать». На практике же на уровне JVM...
🔥3
Java подсказка : не злоупотребляй наследованием. Когда можно — лучше делегируй. Наследование создаёт сильную связку, и это может выстрелить в ногу, если базовый класс изменится.
Предположим, у нас есть такой класс:
и Car наследуется от Engine:
Наследование выражает отношение is, но автомобиль на самом деле не является двигателем, он имеет двигатель. Перепишем через делегацию:
Таким образом эти два класса развязаны, и отношение превращается в has.
👉 Java Portal
Предположим, у нас есть такой класс:
class Engine {
void start() {
}
}и Car наследуется от Engine:
class Car extends Engine {
void drive() {
start();
}
}Наследование выражает отношение is, но автомобиль на самом деле не является двигателем, он имеет двигатель. Перепишем через делегацию:
class Car {
private Engine engine;
Car(Engine engine) {
this.engine = engine;
}
void drive() {
engine.start();
}
}Таким образом эти два класса развязаны, и отношение превращается в has.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
А может ли Java гонять TensorFlow без JNI и без Python?
Автор взял Java 25 + FFM и протащил это всё до C-шного TensorFlow API, собрав рабочий REST-сервис на macOS.
Результат: предсказуемая память, нативная производительность и максимально скучная (в хорошем смысле) архитектура.
Ломали когда-нибудь Quarkus-эндпоинт просто тем, что решили залогировать request body?
В этом гайде показывают, как безопасно аудировать, чистить и трассировать HTTP-запросы через request filters в Quarkus, не блокируя обработку и не убивая API.
Практично и можно почти копипастить.
👉 Java Portal
Автор взял Java 25 + FFM и протащил это всё до C-шного TensorFlow API, собрав рабочий REST-сервис на macOS.
Результат: предсказуемая память, нативная производительность и максимально скучная (в хорошем смысле) архитектура.
Ломали когда-нибудь Quarkus-эндпоинт просто тем, что решили залогировать request body?
В этом гайде показывают, как безопасно аудировать, чистить и трассировать HTTP-запросы через request filters в Quarkus, не блокируя обработку и не убивая API.
Практично и можно почти копипастить.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👀3
Java: не вешай логику в Stream.peek(), используй его только для отладки.
Используй его для легкой отладки
Пример: инспекция потока пайплайна
👉 Java Portal
Используй его для легкой отладки
Пример: инспекция потока пайплайна
list.stream()
.filter(x -> x > 10)
.peek(x -> System.out.println("Filter: " + x))
.map(x -> x * 2)
.peek(x -> System.out.println("Map: " + x))
.toList();
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3