PHPUnit 6.1.x throws array_merge() error when my test class uses its own constructor method

constructor, extends, php, phpunit

Solution

PHPUnit uses the constructor for initialization of the base `TestCase`

You can see the constructor method here: https://github.com/sebastianbergmann/phpunit/blob/6.1.3/src/Framework/TestCase.php#L328

public function __construct($name = null, array $data = [], $dataName = '')

You shouldn't use the constructor, because it's used by phpunit and any change to the signature etc can break things.

You can use the special `setUp` and `setUpBeforeClass` methods which phpunit will call for you.

use PHPUnit\Framework\TestCase;

class XTest extends TestCase
{
    function static setUpBeforeClass()
    { 
       // Called once just like normal constructor
       // You can create database connections here etc
    }

    function setUp()
    {
      //Initialize the test case
      //Called for every defined test
    }

    function testX()
    {
        $this->assertTrue(true);
    }

    // Clean up the test case, called for every defined test
    public function tearDown() { }

    // Clean up the whole test class
    public static function tearDownAfterClass() { }
}

The docs: https://phpunit.de/manual/current/en/fixtures.html

Note that the `setUp` gets called for every specified test in the class.

For a single initialization you can use `setUpBeforeClass`.

And another tip: run your phpunit with the `-v` flag to display stack traces ;)

Problem

I get this error: ``` 1) XTest::testX array_merge(): Argument #1 is not an array ERRORS! Tests: 1, Assertions: 0, Errors: 1. ``` On this test case: ``` use PHPUnit\Framework\TestCase; class XTest extends TestCase { function __construct() {} function testX() { $this->assertTrue(true); } } ``` If I remove `__construct` method, my tests pass. What is going on with PHPUnit's handling of my class constructor methods? It worked fine in PHPUnit version 4.8, but now I am using PHPUnit version 6.1.3

Original source