Download the PHP package crashuxx/phockito without Composer
On this page you can find all versions of the php package crashuxx/phockito. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package phockito
Phockito - Mockito for PHP
Mocking framework inspired by Mockito for Java
Checkout the original's website for the philosophy behind the API and more examples (although be aware that this is only a partial implementation for now)
Thanks to the developers of Mockito for the inspiration, and hamcrest-php for making this easy.
Example mocking:
If PHPUnit is available, on failure verify throws a PHPUnit_Framework_AssertionFailedError
(looks like an assertion failure),
otherwise just throws an Exception
Example stubbing:
Alternative API, jsMockito style
Spies
Mocks are full mocks - method calls to unstubbed function always return null, and never call the parent function.
You can also create partial mocks by calling spy
instead of mock
. With spies, method calls to unstubbed functions
call the parent function.
Because spies are proper subclasses, this lets you stub in methods that are called by other methods in a class
Argument matching
Phockito allows the use of Hamcrest matchers on any argument. Hamcrest is a library of "matching functions" that, given a value, return true if that value matches some rule.
Hamcrest matchers are not included by default, so the first step is to call Phockito::include_hamcrest();
immediately after including Phockito.
Note that this will import the Hamcrest matchers as global functions - passing false as an argument will keep your namespace clean by making all matchers only available as static methods of Hamcrest
(at the expense of worse looking test code).
Once included you can pass a Hamcrest matcher as an argument in your when or verify rule, eg:
Some common Hamcrest matchers:
- Core
anything
- always matches, useful if you don't care what the object under test is
- Logical
allOf
- matches if all matchers match, short circuits (like PHP &&)anyOf
- matches if any matchers match, short circuits (like PHP ||)not
- matches if the wrapped matcher doesn't match and vice versa
- Object
equalTo
- test object equality using the == operatoranInstanceOf
- test typenotNullValue
,nullValue
- test for null
- Number
closeTo
- test floating point values are close to a given valuegreaterThan
,greaterThanOrEqualTo
,lessThan
,lessThanOrEqualTo
- test ordering
- Text
equalToIgnoringCase
- test string equality ignoring caseequalToIgnoringWhiteSpace
- test string equality ignoring differences in runs of whitespacecontainsString
,endsWith
,startsWith
- test string matching
Differences from Mockito
Stubbing methods more flexible
In Mockito, the methods when building a stub are limited to thenReturns, thenThrows. In Phockito, you can use any method
as long as it has 'return' or 'throw' in it, so Phockito::when(...)->return(1)->thenReturn(2)
is fine.
Type-safe argument matching
In Mockito, to use a Hamcrest matcher, the argThat
method is used to satisfy the type checker. In PHP, a little extra
help is needed. Phockito provides the argOfTypeThat
for provided Hamcrest matchers to type-hinted parameters:
It's also possible to pass a mock to 'when', rather than the result of a method call on a mock, e.g.
Phockito::when($mock)->methodToStub(...)->thenReturn(...)
. This side-steps the type system entirely.
Note that argOfTypeThat
is only compatible with object type-hints; arguments with array
or callable
type-hints
cannot be handled in a type-safe way.
Verify 'times' argument changed
In Mockito, the 'times' argument to verify is an object of interface VerificationMode. Phockito only supports a subset
of Mockito's VerificationMode implementations: times()
, never()
, atLeast()
, atLeastOnce()
, atMost()
, only()
.
The verification modes in Phockito's global functions are named as calledX (e.g. calledAtLeastOnce()
, as opposed to
Phockito::atLeastOnce()
) to avoid conflicts with other global functions (such as those provided by Hamcrest).
Additionally, the 'times' argument can also take either an integer (equivalent to times()
), or an integer followed by
'+' (equivalent to atLeast()
).
Callback instead of answers
In Mockito, you can return dynamic results from a stubbed method by calling thenAnswer with an instance of an object
that has a specific method. In Phockito you call thenCallback with a callback
argument, which gets called with the
arguments the stubbed method was called with.
Default arguments
PHP has default arguments, unlike Java. If you don't specify a default argument in your stub or verify matcher, it'll match the default argument.
Return typing
Mockito returns a type-compatible false, based on the declared return type. We don't have defined type values in PHP, so we always return null. TODO: Support using phpdoc @return when declared.
TODO
- Mockito-specific hamcrest matchers (anyString, etc)
- Ordered verification
License
Copyright (C) 2012 Hamish Friedlander / SilverStripe.
Distributable under either the same license as SilverStripe or the Apache Public License V2 (http://www.apache.org/licenses/LICENSE-2.0.html) at your choice
You don’t have to do anything special to choose one license or the other and you don’t have to notify anyone which license you are using.
Hamcrest-php is under it's own license - see hamcrest-php/LICENSE.txt.