16

I am playing with php 7 and phpunit 6. Here is the test I wrote:

<?php declare(strict_types=1);

namespace Test;

use DesignPatterns\Observer\User;
use DesignPatterns\Observer\UserObserver;
use PHPUnit\Framework\TestCase;

class ObserverTest extends TestCase
{
    public function testChangeInUserLeadsToUserObserverBeingNotified()
    {
        $observer = new UserObserver();

        $user = new User();
        $user->attach($observer);

        $user->changeEmail('foo@bar.com');
        $this->assertCount(1, $observer->getChangedUsers());
    }
}

When I tried to run this test, I got the following error message:

PHP Fatal error:  Class 'PHPUnit\Framework\TestCase' not found in /home/.../.../Test/ObserverTest.php on line 9

I installed PHPUnit with composer, here is my composer.json file content:

{
    "require": {
        "phpunit/phpunit": "^6.0"
    },
    "autoload": {
        "psr-4": {"DesignPatterns\\": "src/"}
    }
}

According to PHPUnit 6 documentation, your tests are now supposed to extends PHPUnit\Framework\TestCase instead of PHPUnit_Framework_TestCase.

I know it's not an issue with autoloading. Actually, if I replace PHPUnit\Framework\TestCase with PHPUnit_Framework_TestCase, it works just fine, but I was wondering why this syntax didn't works.

I tried some research on google, stackoverflow and PHPUnit's github repository, but couldn't find anything.

I am looking forward for your answers,

EDIT

This is how my files are organized:

src/
├── DataMapper
│   ├── StorageAdapter.php
│   ├── UserMapper.php
│   └── User.php
├── Observer
│   ├── UserObserver.php
│   └── User.php
Test/
├── DataMapperTest.php
└── ObserverTest.php
romaind
  • 461
  • 1
  • 3
  • 10

4 Answers4

18

I found the answer:

I was excuting my test with this command line:

phpunit Test/ObserverTest.php

PHPUnit is installed globally on my computer, but it's the 5.1.3 version:

phpunit -v

PHPUnit 5.1.3 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.13-0ubuntu0.16.04.1 with Xdebug 2.4.0
Configuration: /home/.../.../DesignPatterns/phpunit.xml

And the syntax PHPUnit\Framework\TestCase only works with PHPUnit 6

Now, if I run php vendor/bin/phpunit Test/ObserverTest.php, it works perfectly...

romaind
  • 461
  • 1
  • 3
  • 10
3

I'm posting this in case somebody ends up here after upgrading to Symfony 4.4 / 5.0 and is having this error.

In newer versions of Symfony, you have a version which is defined in the phpunit.xml.dist. This version will be downloaded when you run ./bin/phpunit and it's sources will be placed under ./bin/.phpunit/phpunit-VERSION. If you are executing php ./bin/console --env=test debug:container you might get the mentioned by the OP exception. The fix is easy - you need to add the path to the classes in the composer.json:

    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        },
        "classmap": [
            "tests/",
            "bin/.phpunit/phpunit-9.2.0-0/src" <--- Make sure the version is correct.
        ]
    },

Afterwards run composer dump-autoload and finally php ./bin/console --env=test debug:container should work.

tftd
  • 16,203
  • 11
  • 62
  • 106
  • 1
    I ended up with this: `"autoload-dev": { "psr-4": { "App\\Tests\\": "tests/" }, "classmap": [ "bin/.phpunit/phpunit/src" ] },`. `bin/.phpunit` is a symlink. Thanks for sharing! – Veelkoov Aug 20 '21 at 21:45
1

In my case I had a different version of phpunit earlier in my path in the /Applications/MAMP/Library/bin directory. After creating a symbolic link to the globally installed version (7.5.1) instead of 5.1.3, this fixed the error for me:

cd /Applications/MAMP/Library/bin
mv phpunit phpunit_bak
ln -s /usr/local/bin/phpunit phpunit
John Langford
  • 1,272
  • 2
  • 12
  • 15
1

Just in case you are facing PHPUnit\Framework\TestCase not found in PhpStorm,

run php bin/phpunit at root of project, it will download all needed classes and PhpStorm error should gone

R Sun
  • 1,353
  • 14
  • 17