hafriedlander/phockito
Composer 安装命令:
composer require --dev hafriedlander/phockito
包简介
PHP Mocking framework inspired by Mockito for Java
README 文档
README
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:
// Create the mock $iterator = Phockito::mock('ArrayIterator'); // Use the mock object - doesn't do anything, functions return null $iterator->append('Test'); $iterator->asort(); // Selectively verify execution Phockito::verify($iterator)->append('Test'); // 1 is default - can also do 2, 3 for exact numbers, or 1+ for at least one, or 0 for never Phockito::verify($iterator, 1)->asort();
If PHPUnit is available, on failure verify throws a PHPUnit_Framework_AssertionFailedError (looks like an assertion failure),
otherwise just throws an Exception
Example stubbing:
// Create the mock $iterator = Phockito::mock('ArrayIterator'); // Stub in a value Phockito::when($iterator->offsetGet(0))->return('first'); // Prints "first" print_r($iterator->offsetGet(0)); // Prints null, because get(999) not stubbed print_r($iterator->offsetGet(999));
Alternative API, jsMockito style
// Stub in a value Phockito::when($iterator)->offsetGet(0)->return('first');
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
class A { function Foo(){ return 'Foo'; } function Bar(){ return $this->Foo() . 'Bar'; } } // Create a mock $mock = Phockito::mock('A'); print_r($mock->Foo()); // 'null' print_r($mock->Bar()); // 'null' // Create a spy $spy = Phockito::spy('A'); print_r($spy->Foo()); // 'Foo' print_r($spy->Bar()); // 'FooBar' // Stub a method Phockito::when($spy)->Foo()->return('Zap'); print_r($spy->Foo()); // 'Zap' print_r($spy->Bar()); // 'ZapBar'
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:
class A { function Foo($a){ } } $stub = Phockito::mock('A'); Phockito::when($stub)->Foo(anything())->return('Zap');
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:
class A { function Foo(B $b){ } } class B {} $stub = Phockito::mock('A'); $b = new B(); Phockito::when($stub)->Foo(argOfTypeThat('B', is(equalTo($b))))->return('Zap');
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 (like returned by the functions times, atLeastOnce, etc).
For now we just take either an integer, or an integer followed by '+'. It's not extensible.
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.
class Foo { function Bar($a, $b = 2){ /* NOP */ } } // Create the mock $mock = Phockito::mock('Foo'); // Set up a stub Phockito::when($mock->Bar(1))->return('A'); $mock->Bar(1); // Returns 'A' $mock->Bar(1, 2); // Also returns 'A' $mock->Bar(1, 3); // Returns null, since no stubbed return value matches
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.
hafriedlander/phockito 适用场景与选型建议
hafriedlander/phockito 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 294.48k 次下载、GitHub Stars 达 70, 最近一次更新时间为 2013 年 05 月 07 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「testing」 「mocks」 「mockito」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 hafriedlander/phockito 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 hafriedlander/phockito 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 hafriedlander/phockito 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A DateTime library that allows mock dates and times in UnitTests.
Test Doubles for the PSR-3 Logger Interface
Testing Suite For Lumen like Laravel does.
Integrate Phockito (a PHP Mocking framework) with SilverStripe
Stubbing and mocking tool for PHP loosely based on Java's Mockito
PHP Mocking framework inspired by Mockito for Java
统计信息
- 总下载量: 294.48k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 70
- 点击次数: 34
- 依赖项目数: 18
- 推荐数: 0
其他信息
- 授权协议: BSD-3-Clause
- 更新时间: 2013-05-07