# Double > Documentation for Double, a modern, human-friendly PHP double library. ## Docs - [Introduction](https://testdoublephp.com/): Double has been designed to be read by a human. This code reads like a sentence: it creates a double for BookRepository. That double expects find to be… - [Installation](https://testdoublephp.com/installation): This library needs PHP 8.2 or newer, and nothing else. There's no required dependency on PHPUnit or any other test runner. The core library doesn't know… - [Creating Doubles](https://testdoublephp.com/creating-doubles): Nothing about the double is configured yet. See Expectations for that. This page covers the double itself: how to create one, what it's called in failure… - [Expectations](https://testdoublephp.com/expectations): This is the part you'll write the most: telling a double what you expect to happen, and what should happen when it does. - [Argument Matching](https://testdoublephp.com/argument-matching): A plain value passed to with() covers most tests: with(123) matches the literal 123. What "matches" means depends on the value's type. Scalars, arrays… - [Verification](https://testdoublephp.com/verification): expects() and allows() describe what you expect to happen before the code under test runs. Verification is the other half: confirming, afterward, that… - [Failure Messages](https://testdoublephp.com/failure-messages): A failing test is a message to whoever's looking at it next. This library aims for every one of its messages to name the double, name the call, and point… - [Test Suite Integration](https://testdoublephp.com/test-suite-integration): Nothing in this library requires PHPUnit. But if it's installed in your project, three things improve automatically — and since Pest tests run on real… - [Migrating from Mockery](https://testdoublephp.com/migrating-from-mockery): Most of what you already know from Mockery carries over directly. This page provides a full mapping of the methods and concepts from Mockery to their… - [Contributing](https://testdoublephp.com/contributing): This page covers the standing policies behind the library's design, plus two walkthroughs for the contributions that come up most: adding a matcher and… ## Blog - [What about method-level `passthru`?](https://testdoublephp.com/blog/what-about-method-level-passthru): Mockery lets one stubbed expectation run the real method. Double doesn't, and the reason isn't a missing feature — it's what that need is usually actually asking for. - [Why doesn't Double mock magic methods?](https://testdoublephp.com/blog/why-doesnt-double-mock-magic-methods): __call() has no fixed shape to check a stub against. Two real examples show what to double instead — and one case where the answer isn't Double at all. - [What about "unnamed mocks"?](https://testdoublephp.com/blog/what-about-unnamed-mocks): Why Double doesn't offer an equivalent to Mockery::mock() and what to reach for instead. - [What does a good failure message look like?](https://testdoublephp.com/blog/what-does-a-good-failure-message-look-like): A close read of a real Double failure message, piece by piece. - [How is Double better than Mockery?](https://testdoublephp.com/blog/how-is-double-better-than-mockery): A reply to a question from r/PHP on what actually improves once you move from Mockery to Double. - [Why not `hasReceived()` or `assertReceived()`?](https://testdoublephp.com/blog/why-not-hasreceived-or-assertreceived): Why Double settled on received() instead of a has- or assert-prefixed verb, and why that was a deliberate trade-off. - [Why is it called "Double"?](https://testdoublephp.com/blog/why-is-it-called-double): "Double" borrows its name from "test double," the generic term for any stand-in used in place of a real dependency in a test.