Personally, I don't like these limitations in PHPUnit and the like. IMHO,
they should never be a reason for changing good code. And sometimes,
methods have to be final. I don't know about the specific case, though.

Anyway, some time ago I came across [1], which allows mocking final methods
and classes. IIRC, it does that by removing the `final` keywords from the
tokenized PHP code. I don't know how well it works, nor if it could degrade
performance, but if it doesn't we could bring it in via composer.


[1] - https://github.com/dg/bypass-finals


Il giorno martedì 27 agosto 2019, Aryeh Gregor <[email protected]> ha scritto:

> I see that in some classes, like WANObjectCache, most methods are declared
> final. Why is this? Is it an attempt to optimize?
>
> The problem is that PHPUnit mocks can't touch final methods. Any ->method()
> calls that try to do anything to them silently do nothing. This makes
> writing tests harder.
>
> If we really want these methods to be marked final for some reason, the
> workaround for PHP is to make an interface that has all the desired
> methods, have the class implement the interface, and make type hints all
> refer to the interface instead of the class. But if there's no good reason
> to declare the methods final to begin with, it's simplest to just drop it.
> _______________________________________________
> Wikitech-l mailing list
> [email protected]
> https://lists.wikimedia.org/mailman/listinfo/wikitech-l



-- 
https://meta.wikimedia.org/wiki/User:Daimona_Eaytoy
"Daimona" is not my real name -- he/him
_______________________________________________
Wikitech-l mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/wikitech-l

Reply via email to