PHPackages                             meare/juggler - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Testing &amp; Quality](/categories/testing)
4. /
5. meare/juggler

AbandonedLibrary[Testing &amp; Quality](/categories/testing)

meare/juggler
=============

PHP client for Mountebank

v1.0(9y ago)63.6k[2 issues](https://github.com/meare/juggler/issues)1MITPHPPHP &gt;=5.5

Since Oct 17Pushed 9y ago1 watchersCompare

[ Source](https://github.com/meare/juggler)[ Packagist](https://packagist.org/packages/meare/juggler)[ Docs](https://github.com/meare/juggler)[ RSS](/packages/meare-juggler/feed)WikiDiscussions master Synced 3w ago

READMEChangelog (2)Dependencies (5)Versions (2)Used By (1)

Juggler
=======

[](#juggler)

[![Latest Version on Packagist](https://camo.githubusercontent.com/ad151ce418c15854850aa89ed5db02ad2d9422ac0f0f2b2e2e99af3e783a315d/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d656172652f6a7567676c65722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/meare/juggler)[![Software License](https://camo.githubusercontent.com/55c0218c8f8009f06ad4ddae837ddd05301481fcf0dff8e0ed9dadda8780713e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](LICENSE.md)[![Build Status](https://camo.githubusercontent.com/54ee6508f6fb158c3f60635578da21e1c4b131fea578838baa33c692e628f29f/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6d656172652f6a7567676c65722f6261646765732f6275696c642e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/meare/juggler/build-status/master)[![Code Coverage](https://camo.githubusercontent.com/67cfe771f85f8c41f83c4dea6d5f695c0f16c4ba529dba8cbccebbcee3dd6fdb/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6d656172652f6a7567676c65722f6261646765732f636f7665726167652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/meare/juggler/?branch=master)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/b3b300b7930a8938bee073d57869ad12a36782f4cd3d5ad687061ee9329e8d86/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f6d656172652f6a7567676c65722f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/meare/juggler/?branch=master)

Juggler is a PHP client for [mountebank](http://www.mbtest.org/) - open source tool that provides test doubles over the wire. Juggler allows to:

- interact with mountebank API;
- verify mocks;
- alter and build imposters;

Only HTTP imposters are supported at the moment.

There is also [Codeception module](https://github.com/meare/codeception-mountebank) available.

Install
-------

[](#install)

Via Composer

```
$ composer require meare/juggler:~1.0
```

Usage
-----

[](#usage)

### API interactions

[](#api-interactions)

Juggler makes interactions with [mountebank API](http://www.mbtest.org/docs/api/overview) easy:

```
use Meare\Juggler\Juggler;

$juggler = new Juggler('localhost');

// Delete active imposters before posting to avoid resource conflicts
$juggler->deleteImposters();
$port = $juggler->postImposterFromFile(__DIR__ . '/contract.json');

// Retrieve imposter contract and save it to file
$juggler->retrieveAndSaveContract($port, __DIR__ . '/retrieved_contract.json');

$juggler->deleteImposter($port);
```

### Mock verification

[](#mock-verification)

[mountebank](http://www.mbtest.org/) remembers every request imposters get if `--mock` command line flag is set.

Here is how to verify mock with Juggler:

```
use Meare\Juggler\Juggler;

$juggler = new Juggler('localhost');

// Post imposter
$port = $juggler->postImposterFromFile(__DIR__ . '/contract.json');

// Do some requests
file_get_contents('http://mountebank:4545/foo?bar=1');
file_get_contents('http://mountebank:4545/foo?bar=2&zar=3');

// Retrieve imposter and verify it received requests
$imposter = $juggler->getHttpImposter($port);
$imposter->hasRequestsByCriteria([
    'method' => 'GET',
    'path'   => '/foo',
    'query'  => ['bar' => 1],
]); // Will return true
```

[Read more on mock verification](http://www.mbtest.org/docs/api/mocks)

### Imposter altering

[](#imposter-altering)

Imagine you have stub for `GET /account/3` which returns account balance:

```
{
  "port": 4545,
  "protocol": "http",
  "stubs": [
    {
      "responses": [
        {
          "is": {
            "statusCode": 200,
            "body": {
              "clientId": 3,
              "name": "Dmitar Ekundayo",
              "balance": 24.5
            },
            "_mode": "text"
          }
        }
      ],
      "predicates": [
        {
          "equals": {
            "method": "GET",
            "path": "/client/3"
          }
        }
      ]
    }
  ]
}
```

At some point you might not want to create separate stub to imitate negative balance. Altering imposter will do the trick:

```
use Meare\Juggler\Juggler;

$juggler = new Juggler('localhost');
$port = $juggler->postImposterFromFile(__DIR__ . '/contract.json');

// Find stub by predicates and alter response
$imposter = $juggler->getHttpImposter($port);
$imposter->findStubByPredicates([['equals' => ['method' => 'GET', 'path' => '/account/3']]])
    ->getIsResponse()
    ->modifyBody(function (array $body) {
        $body['balance'] = -5.75;

        return $body;
    });

// Delete imposter and post again
$juggler->replaceImposter($imposter);
```

Building imposter
-----------------

[](#building-imposter)

```
use Meare\Juggler\Imposter\HttpImposter;
use Meare\Juggler\Imposter\Stub\Predicate\Predicate;
use Meare\Juggler\Imposter\Stub\Response\IsResponse;
use Meare\Juggler\Juggler;

$juggler = new Juggler('localhost');

// Create imposter with a stub for GET /test-endpoint
$imposter = new HttpImposter;
$imposter->createStub(
    [new IsResponse(200, ['Content-type' => 'application/json'], '{"status":200}')],
    [new Predicate(Predicate::OPERATOR_EQUALS, ['method' => 'GET', 'path' => '/test-endpoint'])]
);

// Post it!
$juggler->postImposter($imposter);
```

Testing
-------

[](#testing)

```
$ composer test
```

Credits
-------

[](#credits)

- [Andrejs Mironovs](https://github.com/meare)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

29

—

LowBetter than 57% of packages

Maintenance13

Infrequent updates — may be unmaintained

Popularity22

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~92 days

Total

2

Last Release

3450d ago

Major Versions

v0.9-beta → v1.02017-01-17

PHP version history (2 changes)v0.9-betaPHP ~7.0

v1.0PHP &gt;=5.5

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/3748248?v=4)[Andrejs](/maintainers/meare)[@meare](https://github.com/meare)

---

Top Contributors

[![meare](https://avatars.githubusercontent.com/u/3748248?v=4)](https://github.com/meare "meare (24 commits)")

---

Tags

mountebanktestingapiclientmountebankcomponent testing

###  Code Quality

TestsPHPUnit

Code StylePHP\_CodeSniffer

### Embed Badge

![Health badge](/badges/meare-juggler/health.svg)

```
[![Health](https://phpackages.com/badges/meare-juggler/health.svg)](https://phpackages.com/packages/meare-juggler)
```

###  Alternatives

[magento/magento2-functional-testing-framework

Magento2 Functional Testing Framework

15311.8M36](/packages/magento-magento2-functional-testing-framework)[imbo/behat-api-extension

API extension for Behat

1092.6M9](/packages/imbo-behat-api-extension)[files.com/files-php-sdk

Files.com PHP SDK

2478.1k](/packages/filescom-files-php-sdk)[aeris/guzzle-http-mock

A mock library for verifying requests made with the Guzzle Http Client, and mocking responses.

2613.1k1](/packages/aeris-guzzle-http-mock)[eslazarev/wildberries-sdk

Wildberries OpenAPI clients (generated).

252.5k](/packages/eslazarev-wildberries-sdk)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
