jakzal/phpunit-injector

Deprecation notices

Opened this issue ยท 12 comments

1x: The "Zalas\Injector\PHPUnit\TestListener\ServiceInjectorListener" class implements "PHPUnit\Framework\TestListener" that is deprecated Use the TestHook interfaces instead.

1x: The "Zalas\Injector\PHPUnit\TestListener\ServiceInjectorListener" class uses "PHPUnit\Framework\TestListenerDefaultImplementation" that is deprecated The TestListener interface is deprecated.

I am getting these deprecation notices with PHPUnit 9.2.2.

@gjuric yes, I'm afraid this extension will stop working in PHPUnit 10 due to BC incompatible changes in PHPUnit.

I've been digging around this a little bit and it seems like the TestHooks in PHPUnit 9.5 are currently not a suitable replacement for TestListeners since they provide only the class name of a test being run and not the actual Test.

I've managed to create a PoC that works by putting the code that is currently in ServiceInjectorListener into a class that is extending PHPUnit\Framework\TestListener, running the code that is in ServiceInjectorListener::startTest() in a setUp() method of this class and making my tests extend this.

I am not really a fan of this approach since one has to remember to call parent::setUp() otherwise this will not work.

Do you have any other ideas/plans on how to approach or do you even plan to work on this? Also, do you need any help?

@gjuric I don't have the capacity to work on this at the moment, so feel free to take over! I'll be happy to review your POC too.

OK, looking into it. Unfortunately my idea falls apart if you already need to extend another TestCase class (not the original, PHPUnit one). I've opened an issue on sebastianbergmann/phpunit#4541 but it looks like there will be no suitable replacement for the current implementation.

@gjuric looks like they won't support it "by design". All's left is to wait and see what kind of support PHPUnit will get for real annotations.

There's one more thing to check. In the past, I played with AOP to do similar kind of injections. However, with PHPUnit it wasn't possible as AOP frameworks usually hook into the autoloading process and PHPUnit wasn't using composer autloading. Mind checking if that's still the case or have they switched to autoload test classes with composer?

Perhaps the new event system will somehow enable this: sebastianbergmann/phpunit#4676

I have migrated another extension to PHPUnit 10: jakzal/phpunit-globals#31

For anyone who'd like to pick this up, the PHPUnit globals extension also supports attributes now: https://github.com/jakzal/phpunit-globals/blob/main/src/GlobalsAttributeReader.php

I have found a pretty straightforward solution for me, but I am not sure if it is suitable for everyone:

I already have this class in the Symfony project:

abstract class WebTestCase extends SymfonyWebTestCase implements ServiceContainerTestCase

Then everything I needed was to update my setUp method like this:

protected function setUp(): void
{
    parent::setUp();

    $injector = new Injector(new TestCaseContainerFactory($this), new DefaultExtractorFactory([TestCase::class, Assert::class]));
    $injector->inject($this);
}

@TomasLudvik yes, this is what the extension is doing for you effectively.

This bit of code could be placed in a trait with a [Before] hook and be used instead of the extension.

The point of the extension is to do it automatically. If anyone's interested in helping with migration I've migrated another extension to the new phpunit extension system already: jakzal/phpunit-globals#31

@jakzal I understand, I have tried the trait way, but the method from trait is not called, if I move it to the Test class, it works correctly.

TomasLudvik@56f4398