Конспект і таймкоди
0:00
Type-aware assertions з AssertJ
Object equality не підходить для всіх API checks. Dates потребують before/after/close-to comparison, floating-point — tolerance, collections — contains/order/filter semantics, nested objects — field-level comparison.
AssertJ починає з assertThat(actual) і пропонує methods відповідно до actual type. Це зменшує custom comparison code і робить expected behavior видимим у test.
10:00
Generated assertions і їх межі
Assertion generator може створити fluent hasName, hasCode та інші methods з model classes. Розглядаються hard і soft assertions, package include/exclude та custom templates.
Live demo виявляє plugin/version/import failures. Урок: generated assertion code потрібно компілювати у clean build і review, а не вважати generator output правильним за замовчуванням.
30:00
Decorator/custom assertion і зрозумілі failures
Коли generated API не дає потрібного message, автор обгортає response в custom assertion/decorator. Status assertion друкує expected status, actual status і response body в одном failure header.
Це зменшує кількість кліків у report і швидше вказує на client/server error. Custom formatter має бути малим: standard string formatting краще за власний string-builder framework.
50:00
Test boundaries у microservice/event-driven systems
Перевірка одного HTTP response не покриває asynchronous processing. Для Kafka/RabbitMQ flow окремо перевіряють publication, consumer processing, state change і downstream integrations.
Component test може ізолювати service з mocks/stubs, а environment test — перевірити real wiring. Ні один рівень не замінює інший; assertion design має відповідати failure boundary цього тесту.
1:10:00
Standard error DTO і partial comparison
Error response моделює code, message і diagnostic fields. Тест будує expected error і порівнює stable fields, ігноруючи unique stack trace/request id, якщо вони не є частиною очікуваної behavior.
Така partial/recursive comparison краща за аболютне equality, коли response містить server-generated data. Але ignored fields мають бути точковими, інакше test пропустить contract regression.
1:20:00
Fluent response assertions і business-readable API
Над Response будується small fluent wrapper: status, typed body, field/domain assertions, завершення chain. Це дає тесту domain vocabulary і прибирає repeated parsing.
Важливо не сховати expected behavior за великим «validateEverything». Fluent method має виражати одну observable property і давати specific failure.
1:40:00
Generated fluent asserts, API-first і contract testing
Generator може створити assertThat(pet).hasName(...), але import conflicts і plugin age можуть звести користь нанівець. Сучасний AssertJ already має rich extracting/recursive/custom assertion APIs, тому generation варта лише для real repeated domain vocabulary.
API-first підхід робить specification upstream input для backend і clients. Jackson deserialization вже перевіряє shape/types, але не доводить business semantics. Окрема contract-testing infrastructure потрібна, коли spec/code generation не закривають real producer–consumer risk.