A single-request mock answers the same way every time. That is fine when you are checking that a tool gets called with the right arguments, which is the purpose of the simplest mocking level described in the LangWatch Scenario mocking guide. The guide separates tool function mocking (does the agent pick the right tool and pass the right parameters), API-level mocking (does the tool implementation handle the HTTP call) and dependency injection (does the whole system behave when dependencies are swappable). None of those levels, on its own, tells you what happens across five calls.
A multi-step agent breaks that assumption in three ways, each documented in the Braintrust guide to stateful agent evals. First, the agent has side effects: it creates tickets, updates rows, sends messages. Second, it depends on external systems whose state changes between steps. Third, it is trajectory-sensitive: a choice at step two changes which tools are even reachable at step five. If your mock returns the same "order found" payload on every call, a test that should catch a lost confirmation number will pass, because the mock never stopped cooperating.
The practical consequence is simple to state and easy to get wrong. In a multi-step fixture, the mock's answer is part of the input to the agent's next decision. Change the answer at step three and you have written a different test. That is the reason the fixture has to be designed as a sequence, not as a constant.
A word on where a real API call still belongs. If the agent's task can only be judged by what the live system does (a genuine payment authorisation, a real database constraint), a mock cannot substitute. The usual pattern is a sandbox or a teardown-backed live run, as described in this Stack Overflow discussion of integration tests against external APIs. Use the stateful fixture for everything else.



