Short answer: Code-first stubbing starts from the test and is immediately expressive; spec-first starts from the contract and is correct by construction. The first is a discipline of maintaining stubs; the second is a discipline of maintaining the spec. For a team that already versions an API, the spec is the durable source.

What code-first optimizes for

Immediacy and control: write the stub in the test, match exactly, and run. The cost is that the stubs are a separate description that can drift.

What spec-first optimizes for

PropertyCode-firstSpec-first
SourceStub codeContract
Upfront costLowModeling
DriftCommonRare
Generated surfacesNoneMany

Why the spec scales

One contract drives the mock, the docs, and the tools, so a change is made once. Code-first stubs are updated in the tests and nowhere else.

The honest tradeoff

Code-first is the pragmatic start for a JVM test. Spec-first pays back as the surface grows and the languages multiply.

This is part of the Powerduck vs WireMock comparison. Next, read the cloud comparison.