Your Spring AI tests are slow, flaky, and cost money. Here's how to make them deterministic. Rifat Cakir released spring-ai-test-tools, a VCR-style library that records real Spring AI interactions and replays them deterministically in tests, eliminating slow, flaky, and costly live model calls. The library attaches to ChatClient.Builder via ChatClientBuilderCustomizer, caches exact SHA-256 request hashes, and supports REPLAY_ONLY mode for CI, making cache misses loud failures. Replay runs in about 0.8 ms versus seconds for live calls, and it supports tool calls, streaming, entity mapping, embeddings, and evaluators. You wire up Spring AI, the ChatClient fluent API feels great, your feature works. Then you sit down to write a test — and every good option is bad. A test that calls a real model is: The usual workarounds all hurt: Mockito means hand-building Spring AI's nested ChatResponse → Generation → AssistantMessage graph and asserting against a response you wrote; WireMock/MockWebServer means owning each provider's exact wire JSON, SSE frames, and tool-call envelopes, and rewriting it all when you switch providers; the real model is the four problems above, accepted rather than solved. There's a well-worn answer from the HTTP world — Ruby's VCR, Python's vcrpy : record the real interaction once, replay it deterministically after. The catch is those work at the HTTP layer, and Spring AI's value is the abstraction above HTTP. So I built the same idea where Spring AI actually lives. One dependency: