diff --git a/gnu/packages/patches/php-hamcrest-hamcrest-php-phpunit-compatibility.patch b/gnu/packages/patches/php-hamcrest-hamcrest-php-phpunit-compatibility.patch
new file mode 100644
index 0000000000..40b38d30de
--- /dev/null
+++ b/gnu/packages/patches/php-hamcrest-hamcrest-php-phpunit-compatibility.patch
@@ -0,0 +1,190 @@
+From a23ce52b659b841fcc693ca800be8794d963c929 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?David=20Pr=C3=A9vot?= <taffit@debian.org>
+Date: Sun, 12 Jul 2020 12:18:05 -0400
+Subject: [PATCH] Compatibility with recent PHPUnit (8)
+
+---
+ tests/Hamcrest/Core/CombinableMatcherTest.php          | 2 +-
+ tests/Hamcrest/Core/IsInstanceOfTest.php               | 2 +-
+ tests/Hamcrest/Core/SetTest.php                        | 2 +-
+ tests/Hamcrest/FeatureMatcherTest.php                  | 2 +-
+ tests/Hamcrest/MatcherAssertTest.php                   | 2 +-
+ tests/Hamcrest/StringDescriptionTest.php               | 2 +-
+ tests/Hamcrest/Text/IsEqualIgnoringWhiteSpaceTest.php  | 2 +-
+ tests/Hamcrest/Text/StringContainsIgnoringCaseTest.php | 2 +-
+ tests/Hamcrest/Text/StringContainsInOrderTest.php      | 2 +-
+ tests/Hamcrest/Text/StringContainsTest.php             | 2 +-
+ tests/Hamcrest/Text/StringEndsWithTest.php             | 2 +-
+ tests/Hamcrest/Text/StringStartsWithTest.php           | 2 +-
+ tests/Hamcrest/Xml/HasXPathTest.php                    | 2 +-
+ 13 files changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/tests/Hamcrest/Core/CombinableMatcherTest.php b/tests/Hamcrest/Core/CombinableMatcherTest.php
+index 463c75437..5a5fe235c 100644
+--- a/tests/Hamcrest/Core/CombinableMatcherTest.php
++++ b/tests/Hamcrest/Core/CombinableMatcherTest.php
+@@ -7,7 +7,7 @@ class CombinableMatcherTest extends \Hamcrest\AbstractMatcherTest
+     private $_either_3_or_4;
+     private $_not_3_and_not_4;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         $this->_either_3_or_4 = \Hamcrest\Core\CombinableMatcher::either(equalTo(3))->orElse(equalTo(4));
+         $this->_not_3_and_not_4 = \Hamcrest\Core\CombinableMatcher::both(not(equalTo(3)))->andAlso(not(equalTo(4)));
+diff --git a/tests/Hamcrest/Core/IsInstanceOfTest.php b/tests/Hamcrest/Core/IsInstanceOfTest.php
+index f74cfdb52..0d6228ae5 100644
+--- a/tests/Hamcrest/Core/IsInstanceOfTest.php
++++ b/tests/Hamcrest/Core/IsInstanceOfTest.php
+@@ -7,7 +7,7 @@ class IsInstanceOfTest extends \Hamcrest\AbstractMatcherTest
+     private $_baseClassInstance;
+     private $_subClassInstance;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         $this->_baseClassInstance = new \Hamcrest\Core\SampleBaseClass('good');
+         $this->_subClassInstance = new \Hamcrest\Core\SampleSubClass('good');
+diff --git a/tests/Hamcrest/Core/SetTest.php b/tests/Hamcrest/Core/SetTest.php
+index aa5e4e7be..35ae3b996 100644
+--- a/tests/Hamcrest/Core/SetTest.php
++++ b/tests/Hamcrest/Core/SetTest.php
+@@ -7,7 +7,7 @@ class SetTest extends \Hamcrest\AbstractMatcherTest
+     public static $_classProperty;
+     public $_instanceProperty;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         self::$_classProperty = null;
+         unset($this->_instanceProperty);
+diff --git a/tests/Hamcrest/FeatureMatcherTest.php b/tests/Hamcrest/FeatureMatcherTest.php
+index 1b0230498..0308300ac 100644
+--- a/tests/Hamcrest/FeatureMatcherTest.php
++++ b/tests/Hamcrest/FeatureMatcherTest.php
+@@ -34,7 +34,7 @@ class FeatureMatcherTest extends \Hamcrest\AbstractMatcherTest
+ 
+     private $_resultMatcher;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         $this->_resultMatcher = $this->_resultMatcher();
+     }
+diff --git a/tests/Hamcrest/MatcherAssertTest.php b/tests/Hamcrest/MatcherAssertTest.php
+index dc12fba54..ee287fb1e 100644
+--- a/tests/Hamcrest/MatcherAssertTest.php
++++ b/tests/Hamcrest/MatcherAssertTest.php
+@@ -6,7 +6,7 @@
+ class MatcherAssertTest extends TestCase
+ {
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         \Hamcrest\MatcherAssert::resetCount();
+     }
+diff --git a/tests/Hamcrest/StringDescriptionTest.php b/tests/Hamcrest/StringDescriptionTest.php
+index ed716d13e..402682ac7 100644
+--- a/tests/Hamcrest/StringDescriptionTest.php
++++ b/tests/Hamcrest/StringDescriptionTest.php
+@@ -23,7 +23,7 @@ class StringDescriptionTest extends TestCase
+ 
+     private $_description;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         $this->_description = new \Hamcrest\StringDescription();
+     }
+diff --git a/tests/Hamcrest/Text/IsEqualIgnoringWhiteSpaceTest.php b/tests/Hamcrest/Text/IsEqualIgnoringWhiteSpaceTest.php
+index 27ad338b7..48ad19eb9 100644
+--- a/tests/Hamcrest/Text/IsEqualIgnoringWhiteSpaceTest.php
++++ b/tests/Hamcrest/Text/IsEqualIgnoringWhiteSpaceTest.php
+@@ -6,7 +6,7 @@ class IsEqualIgnoringWhiteSpaceTest extends \Hamcrest\AbstractMatcherTest
+ 
+     private $_matcher;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         $this->_matcher = \Hamcrest\Text\IsEqualIgnoringWhiteSpace::equalToIgnoringWhiteSpace(
+             "Hello World   how\n are we? "
+diff --git a/tests/Hamcrest/Text/StringContainsIgnoringCaseTest.php b/tests/Hamcrest/Text/StringContainsIgnoringCaseTest.php
+index 73023007b..3d2b287de 100644
+--- a/tests/Hamcrest/Text/StringContainsIgnoringCaseTest.php
++++ b/tests/Hamcrest/Text/StringContainsIgnoringCaseTest.php
+@@ -8,7 +8,7 @@ class StringContainsIgnoringCaseTest extends \Hamcrest\AbstractMatcherTest
+ 
+     private $_stringContains;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         $this->_stringContains = \Hamcrest\Text\StringContainsIgnoringCase::containsStringIgnoringCase(
+             strtolower(self::EXCERPT)
+diff --git a/tests/Hamcrest/Text/StringContainsInOrderTest.php b/tests/Hamcrest/Text/StringContainsInOrderTest.php
+index 4c465b29d..0f9d0a0a1 100644
+--- a/tests/Hamcrest/Text/StringContainsInOrderTest.php
++++ b/tests/Hamcrest/Text/StringContainsInOrderTest.php
+@@ -6,7 +6,7 @@ class StringContainsInOrderTest extends \Hamcrest\AbstractMatcherTest
+ 
+     private $_m;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         $this->_m = \Hamcrest\Text\StringContainsInOrder::stringContainsInOrder(array('a', 'b', 'c'));
+     }
+diff --git a/tests/Hamcrest/Text/StringContainsTest.php b/tests/Hamcrest/Text/StringContainsTest.php
+index bf4afa3c9..971fa98fd 100644
+--- a/tests/Hamcrest/Text/StringContainsTest.php
++++ b/tests/Hamcrest/Text/StringContainsTest.php
+@@ -8,7 +8,7 @@ class StringContainsTest extends \Hamcrest\AbstractMatcherTest
+ 
+     private $_stringContains;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         $this->_stringContains = \Hamcrest\Text\StringContains::containsString(self::EXCERPT);
+     }
+diff --git a/tests/Hamcrest/Text/StringEndsWithTest.php b/tests/Hamcrest/Text/StringEndsWithTest.php
+index 9a30f9520..58b43e538 100644
+--- a/tests/Hamcrest/Text/StringEndsWithTest.php
++++ b/tests/Hamcrest/Text/StringEndsWithTest.php
+@@ -8,7 +8,7 @@ class StringEndsWithTest extends \Hamcrest\AbstractMatcherTest
+ 
+     private $_stringEndsWith;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         $this->_stringEndsWith = \Hamcrest\Text\StringEndsWith::endsWith(self::EXCERPT);
+     }
+diff --git a/tests/Hamcrest/Text/StringStartsWithTest.php b/tests/Hamcrest/Text/StringStartsWithTest.php
+index 3be201f1a..72fa59b6e 100644
+--- a/tests/Hamcrest/Text/StringStartsWithTest.php
++++ b/tests/Hamcrest/Text/StringStartsWithTest.php
+@@ -8,7 +8,7 @@ class StringStartsWithTest extends \Hamcrest\AbstractMatcherTest
+ 
+     private $_stringStartsWith;
+ 
+-    protected function setUp()
++    protected function setUp(): void
+     {
+         $this->_stringStartsWith = \Hamcrest\Text\StringStartsWith::startsWith(self::EXCERPT);
+     }
+diff --git a/tests/Hamcrest/Xml/HasXPathTest.php b/tests/Hamcrest/Xml/HasXPathTest.php
+index 677488716..f51264ea9 100644
+--- a/tests/Hamcrest/Xml/HasXPathTest.php
++++ b/tests/Hamcrest/Xml/HasXPathTest.php
+@@ -7,7 +7,7 @@ class HasXPathTest extends \Hamcrest\AbstractMatcherTest
+     protected static $doc;
+     protected static $html;
+ 
+-    public static function setUpBeforeClass()
++    public static function setUpBeforeClass(): void
+     {
+         self::$xml = <<<XML
+ <?xml version="1.0"?>
diff --git a/gnu/packages/php-xyz.scm b/gnu/packages/php-xyz.scm
index 6d1efc795f..81044dc66c 100644
--- a/gnu/packages/php-xyz.scm
+++ b/gnu/packages/php-xyz.scm
@@ -352,3 +352,43 @@ (define-public php-fig-log-test
     (home-page "https://github.com/php-fig/log-test")
     (license license:expat)))
 
+(define-public php-hamcrest-hamcrest-php
+  (package
+    (name "php-hamcrest-hamcrest-php")
+    (version "2.0.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hamcrest/hamcrest-php")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1n6idxz1rc17zky84khrqfyndh4ffb7jvd1nb14saxdissgq5y5j"))
+       (patches
+        (search-patches "php-hamcrest-hamcrest-php-phpunit-compatibility.patch"))))
+    (build-system composer-build-system)
+    (arguments
+     `(#:test-flags
+       '("--configuration" "tests/phpunit.xml.dist"
+         "--exclude-group" "skipTest")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-recent-phpunit-build
+           (lambda _
+             (substitute* "tests/Hamcrest/UtilTest.php"
+               (("assertInternalType\\('array', ")
+                "assertIsArray(")
+               ;; Ignore this test.
+               (("@expectedException InvalidArgumentException")
+                "@group skipTest")))))))
+    (native-inputs
+     (list php-phpunit-php-file-iterator php-phpunit-phpunit))
+    (synopsis "PHP port of Hamcrest Matchers")
+    (description "Hamcrest is a matching library originally written for Java,
+but subsequently ported to many other languages.  This package is the
+official PHP port of Hamcrest and essentially follows a literal translation of
+the original Java API for Hamcrest, with a few PHP-related exceptions.")
+    (home-page "https://github.com/hamcrest/hamcrest-php")
+    (license license:bsd-3)))
+
