← Java

Конспект і таймкоди

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.

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.