Quality

Generated code that ships real tests

“Tested” is easy to claim and easy to fake with empty happy-path tests. Here it means a four-layer pyramid, success and error paths, and coverage you can inspect, measured with JaCoCo, not asserted in a slide.

The four-layer test pyramid

Four layers, each its own Maven profile, each catching a different class of bug. From the base up:

  • Unit — every class in isolation, its collaborators mocked. Fast and deterministic; catches logic and validation mistakes.
  • Integration — the persistence adapters against a real PostgreSQL, MongoDB and Redis spun up with Testcontainers, not an in-memory stand-in; catches mapping, SQL and type mismatches.
  • Component — the whole service booted on a random port and driven through its HTTP boundary; catches contract, status-code and validation errors.
  • End-to-end — a full user journey with every collaborator real, including outbox propagation and email verification; catches the wiring between the parts.

Coverage, measured not claimed

Methods, lines and branches, measured with JaCoCo. Every path executed and asserted, not just run. Error paths too: 400, 401, 404, 415, not only the 200. There’s deliberately no consumer-contract layer, because the OpenAPI/Swagger spec is the contract and the component layer verifies it.

Proof the tests catch bugs

A line that runs is not the same as a line whose behaviour is checked, so the coverage number is pressure-tested with mutation testing (PIT): it injects faults into the code and requires a test to fail. A high line count with a low mutation score means the tests execute code without asserting it. Here the mutation score is held at 95%+.

The architecture is tested too

The hexagon is not just a folder convention; it is verified. ArchUnit rules run inside the suite and fail the build if the domain reaches for the framework, or a layer imports something it should not. The structure cannot quietly rot into layered MVC wearing hexagonal folder names.

One query, not N+1

Bulk and batch operations are held to a single round-trip. A create-many or a bulk update is one batched statement, never a loop of N+1 queries hidden behind a tidy API. It is a property the suite guards, not a hope.

Inspect it yourself

Every demo exposes the real artifacts behind the number: live Swagger, the Allure dashboard, JaCoCo coverage and the raw test files. The coverage stops being a claim and becomes something you can open.

See a backend running →Prefer to talk? Book a call →
← Back to the overview