Skip to content

Commit 97b3278

Browse files
feat: Support for PHPUnit 10 (#56)
1 parent b9ba2db commit 97b3278

9 files changed

+355
-27
lines changed

.github/workflows/tests.yml

+69-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ jobs:
1313
strategy:
1414
matrix:
1515
php-version:
16+
- '8.2'
1617
- '8.1'
1718
- '8.0'
1819
- '7.4'
@@ -21,6 +22,8 @@ jobs:
2122
- '7.1'
2223
- '7.0'
2324
phpunit-version:
25+
- '10.0.0'
26+
- '9.6.0'
2427
- '9.5.0'
2528
- '9.4.0'
2629
- '9.3.0'
@@ -46,6 +49,52 @@ jobs:
4649
- '6.0.0'
4750

4851
exclude:
52+
# PHP 8.2 Exclusions
53+
- php-version: '8.2'
54+
phpunit-version: '9.4.0'
55+
- php-version: '8.2'
56+
phpunit-version: '9.3.0'
57+
- php-version: '8.2'
58+
phpunit-version: '9.2.0'
59+
- php-version: '8.2'
60+
phpunit-version: '9.1.0'
61+
- php-version: '8.2'
62+
phpunit-version: '9.0.0'
63+
- php-version: '8.2'
64+
phpunit-version: '8.4.0'
65+
- php-version: '8.2'
66+
phpunit-version: '8.3.0'
67+
- php-version: '8.2'
68+
phpunit-version: '8.2.0'
69+
- php-version: '8.2'
70+
phpunit-version: '8.1.0'
71+
- php-version: '8.2'
72+
phpunit-version: '8.0.0'
73+
- php-version: '8.2'
74+
phpunit-version: '7.5.0'
75+
- php-version: '8.2'
76+
phpunit-version: '7.4.0'
77+
- php-version: '8.2'
78+
phpunit-version: '7.3.0'
79+
- php-version: '8.2'
80+
phpunit-version: '7.2.0'
81+
- php-version: '8.2'
82+
phpunit-version: '7.1.0'
83+
- php-version: '8.2'
84+
phpunit-version: '7.0.0'
85+
- php-version: '8.2'
86+
phpunit-version: '6.5.0'
87+
- php-version: '8.2'
88+
phpunit-version: '6.4.0'
89+
- php-version: '8.2'
90+
phpunit-version: '6.3.0'
91+
- php-version: '8.2'
92+
phpunit-version: '6.2.0'
93+
- php-version: '8.2'
94+
phpunit-version: '6.1.0'
95+
- php-version: '8.2'
96+
phpunit-version: '6.0.0'
97+
4998
# PHP 8.1 Exclusions
5099
- php-version: '8.1'
51100
phpunit-version: '9.4.0'
@@ -93,6 +142,8 @@ jobs:
93142
phpunit-version: '6.0.0'
94143

95144
# PHP 8.0 Exclusions
145+
- php-version: '8.0'
146+
phpunit-version: '10.0.0'
96147
- php-version: '8.0'
97148
phpunit-version: '9.2.0'
98149
- php-version: '8.0'
@@ -135,6 +186,8 @@ jobs:
135186
phpunit-version: '6.0.0'
136187

137188
# PHP 7.4 Exclusions
189+
- php-version: '7.4'
190+
phpunit-version: '10.0.0'
138191
- php-version: '7.4'
139192
phpunit-version: '8.1.0'
140193
- php-version: '7.4'
@@ -161,8 +214,16 @@ jobs:
161214
phpunit-version: '6.1.0'
162215
- php-version: '7.4'
163216
phpunit-version: '6.0.0'
217+
218+
# PHP 7.3 Exclusions
219+
- php-version: '7.3'
220+
phpunit-version: '10.0.0'
164221

165222
# PHP 7.2 Exclusions
223+
- php-version: '7.2'
224+
phpunit-version: '10.0.0'
225+
- php-version: '7.2'
226+
phpunit-version: '9.6.0'
166227
- php-version: '7.2'
167228
phpunit-version: '9.5.0'
168229
- php-version: '7.2'
@@ -177,6 +238,10 @@ jobs:
177238
phpunit-version: '9.0.0'
178239

179240
# PHP 7.1 Exclusions
241+
- php-version: '7.1'
242+
phpunit-version: '10.0.0'
243+
- php-version: '7.1'
244+
phpunit-version: '9.6.0'
180245
- php-version: '7.1'
181246
phpunit-version: '9.5.0'
182247
- php-version: '7.1'
@@ -203,6 +268,10 @@ jobs:
203268
phpunit-version: '8.0.0'
204269

205270
# PHP 7.0 Exclusions
271+
- php-version: '7.0'
272+
phpunit-version: '10.0.0'
273+
- php-version: '7.0'
274+
phpunit-version: '9.6.0'
206275
- php-version: '7.0'
207276
phpunit-version: '9.5.0'
208277
- php-version: '7.0'
@@ -244,8 +313,6 @@ jobs:
244313
steps:
245314
- name: Checkout
246315
uses: actions/checkout@v3
247-
with:
248-
ref: ${{ github.head_ref }}
249316

250317
- name: Install PHP
251318
uses: shivammathur/setup-php@v2

autoload.php

+17-3
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,16 @@ class_alias(
6767
);
6868
}
6969

70-
if (! class_exists(\PHPUnit\Framework\BaseTestListener::class)) {
70+
$hasVersion = class_exists(\PHPUnit\Runner\Version::class);
71+
72+
if ($hasVersion
73+
&& version_compare(\PHPUnit\Runner\Version::id(), '10.0.0') >= 0
74+
) {
75+
class_alias(
76+
phpmock\phpunit\MockDisablerPHPUnit10::class,
77+
phpmock\phpunit\MockDisabler::class
78+
);
79+
} elseif (! class_exists(\PHPUnit\Framework\BaseTestListener::class)) {
7180
include __DIR__ . '/compatibility/BaseTestListener.php';
7281
class_alias(
7382
phpmock\phpunit\MockDisablerPHPUnit7::class,
@@ -80,12 +89,17 @@ class_alias(
8089
);
8190
}
8291

83-
if (class_exists(\PHPUnit\Runner\Version::class)
92+
if ($hasVersion
93+
&& version_compare(\PHPUnit\Runner\Version::id(), '10.0.0') >= 0
94+
) {
95+
class_alias(\phpmock\phpunit\DefaultArgumentRemoverReturnTypes100::class, \phpmock\phpunit\DefaultArgumentRemover::class);
96+
class_alias(\phpmock\phpunit\MockObjectProxyReturnTypes100::class, \phpmock\phpunit\MockObjectProxy::class);
97+
} elseif ($hasVersion
8498
&& version_compare(\PHPUnit\Runner\Version::id(), '8.4.0') >= 0
8599
) {
86100
class_alias(\phpmock\phpunit\DefaultArgumentRemoverReturnTypes84::class, \phpmock\phpunit\DefaultArgumentRemover::class);
87101
class_alias(\phpmock\phpunit\MockObjectProxyReturnTypes84::class, \phpmock\phpunit\MockObjectProxy::class);
88-
} elseif (class_exists(\PHPUnit\Runner\Version::class)
102+
} elseif ($hasVersion
89103
&& version_compare(\PHPUnit\Runner\Version::id(), '8.1.0') >= 0
90104
) {
91105
class_alias(\phpmock\phpunit\DefaultArgumentRemoverReturnTypes::class, \phpmock\phpunit\DefaultArgumentRemover::class);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
namespace phpmock\phpunit;
4+
5+
use phpmock\generator\MockFunctionGenerator;
6+
use PHPUnit\Framework\MockObject\Invocation;
7+
use PHPUnit\Framework\MockObject\Rule\InvocationOrder;
8+
9+
/**
10+
* Removes default arguments from the invocation.
11+
*
12+
* @author Markus Malkusch <markus@malkusch.de>
13+
* @link bitcoin:1335STSwu9hST4vcMRppEPgENMHD2r1REK Donations
14+
* @license http://www.wtfpl.net/txt/copying/ WTFPL
15+
* @internal
16+
*/
17+
class DefaultArgumentRemoverReturnTypes100 extends InvocationOrder
18+
{
19+
/**
20+
* @SuppressWarnings(PHPMD)
21+
*/
22+
public function invokedDo(Invocation $invocation): void
23+
{
24+
}
25+
26+
/**
27+
* @SuppressWarnings(PHPMD)
28+
*/
29+
public function matches(Invocation $invocation) : bool
30+
{
31+
$iClass = class_exists(Invocation::class);
32+
33+
if ($iClass
34+
|| $invocation instanceof Invocation\StaticInvocation
35+
) {
36+
$this->removeDefaultArguments(
37+
$invocation,
38+
$iClass ? Invocation::class : Invocation\StaticInvocation::class
39+
);
40+
} else {
41+
MockFunctionGenerator::removeDefaultArguments($invocation->parameters);
42+
}
43+
44+
return false;
45+
}
46+
47+
public function verify() : void
48+
{
49+
}
50+
51+
/**
52+
* This method is not defined in the interface, but used in
53+
* PHPUnit_Framework_MockObject_InvocationMocker::hasMatchers().
54+
*
55+
* @return boolean
56+
* @see \PHPUnit_Framework_MockObject_InvocationMocker::hasMatchers()
57+
*/
58+
public function hasMatchers()
59+
{
60+
return false;
61+
}
62+
63+
public function toString() : string
64+
{
65+
return __CLASS__;
66+
}
67+
68+
/**
69+
* Remove default arguments from StaticInvocation or its children (hack)
70+
*
71+
* @SuppressWarnings(PHPMD)
72+
*/
73+
private function removeDefaultArguments(Invocation $invocation, string $class)
74+
{
75+
$remover = function () {
76+
MockFunctionGenerator::removeDefaultArguments($this->parameters);
77+
};
78+
79+
$remover->bindTo($invocation, $class)();
80+
}
81+
}

classes/MockDisablerPHPUnit10.php

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace phpmock\phpunit;
4+
5+
use phpmock\Deactivatable;
6+
use PHPUnit\Event\Test\Finished;
7+
use PHPUnit\Event\Test\FinishedSubscriber;
8+
9+
/**
10+
* Test listener for PHPUnit integration.
11+
*
12+
* This class disables mock functions after a test was run.
13+
*
14+
* @author Markus Malkusch <markus@malkusch.de>
15+
* @link bitcoin:1335STSwu9hST4vcMRppEPgENMHD2r1REK Donations
16+
* @license http://www.wtfpl.net/txt/copying/ WTFPL
17+
* @internal
18+
*/
19+
class MockDisablerPHPUnit10 implements FinishedSubscriber
20+
{
21+
/**
22+
* @var Deactivatable The function mocks.
23+
*/
24+
private $deactivatable;
25+
26+
/**
27+
* Sets the function mocks.
28+
*
29+
* @param Deactivatable $deactivatable The function mocks.
30+
*/
31+
public function __construct(Deactivatable $deactivatable)
32+
{
33+
$this->deactivatable = $deactivatable;
34+
}
35+
36+
/**
37+
* @SuppressWarnings(PHPMD)
38+
*/
39+
public function notify(Finished $event) : void
40+
{
41+
$this->deactivatable->disable();
42+
}
43+
44+
public function endTest(): void
45+
{
46+
$this->deactivatable->disable();
47+
}
48+
}
+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<?php
2+
3+
namespace phpmock\phpunit;
4+
5+
use PHPUnit\Framework\MockObject\Builder\InvocationMocker as BuilderInvocationMocker;
6+
use PHPUnit\Framework\MockObject\InvocationHandler;
7+
use PHPUnit\Framework\MockObject\Rule\InvocationOrder;
8+
use PHPUnit\Framework\MockObject\MockObject;
9+
use phpmock\integration\MockDelegateFunctionBuilder;
10+
11+
/**
12+
* Proxy for PHPUnit's PHPUnit_Framework_MockObject_MockObject.
13+
*
14+
* @author Markus Malkusch <markus@malkusch.de>
15+
* @link bitcoin:1335STSwu9hST4vcMRppEPgENMHD2r1REK Donations
16+
* @license http://www.wtfpl.net/txt/copying/ WTFPL
17+
* @internal
18+
*/
19+
class MockObjectProxyReturnTypes100 implements MockObject
20+
{
21+
/**
22+
* @var MockObject $mockObject The mock object.
23+
*/
24+
private $mockObject;
25+
26+
/**
27+
* Inject the subject.
28+
*
29+
* @param MockObject $mockObject The subject.
30+
*/
31+
public function __construct(MockObject $mockObject)
32+
{
33+
$this->mockObject = $mockObject;
34+
}
35+
36+
/**
37+
* @SuppressWarnings(PHPMD)
38+
*/
39+
// @codingStandardsIgnoreStart
40+
public function __phpunit_getInvocationHandler(): InvocationHandler
41+
{
42+
return $this->mockObject->__phpunit_getInvocationHandler();
43+
}
44+
45+
/**
46+
* @SuppressWarnings(PHPMD)
47+
*/
48+
// @codingStandardsIgnoreStart
49+
public function __phpunit_setOriginalObject(object $originalObject) : void
50+
{
51+
// @codingStandardsIgnoreEnd
52+
$this->mockObject->__phpunit_setOriginalObject($originalObject);
53+
}
54+
55+
/**
56+
* @SuppressWarnings(PHPMD)
57+
*/
58+
// @codingStandardsIgnoreStart
59+
public function __phpunit_verify(bool $unsetInvocationMocker = true) : void
60+
{
61+
// @codingStandardsIgnoreEnd
62+
$this->mockObject->__phpunit_verify($unsetInvocationMocker);
63+
}
64+
65+
public function expects(InvocationOrder $matcher) : BuilderInvocationMocker
66+
{
67+
return $this->mockObject->expects($matcher)->method(MockDelegateFunctionBuilder::METHOD);
68+
}
69+
70+
/**
71+
* This method is not part of the contract but was found in
72+
* PHPUnit's mocked_class.tpl.dist.
73+
*
74+
* @SuppressWarnings(PHPMD)
75+
*/
76+
// @codingStandardsIgnoreStart
77+
public function __phpunit_hasMatchers() : bool
78+
{
79+
// @codingStandardsIgnoreEnd
80+
return $this->mockObject->__phpunit_hasMatchers();
81+
}
82+
83+
/**
84+
* @SuppressWarnings(PHPMD)
85+
*/
86+
// @codingStandardsIgnoreStart
87+
public function __phpunit_setReturnValueGeneration(bool $returnValueGeneration) : void
88+
{
89+
// @codingStandardsIgnoreEnd
90+
$this->mockObject->__phpunit_setReturnValueGeneration($returnValueGeneration);
91+
}
92+
}

0 commit comments

Comments
 (0)