DEV Community

Jeferson Guedes
Jeferson Guedes

Posted on

PHP Modificando propriedade privada sem modificadores

Apresentação

Fala pessoal tudo bem !? A ideia deste artigo é ajudar vocês a contribuir mais com testes dentro da empresa

Vamos a seguinte hipótese imagina que te peçam para testar uma classe inchada cheio de classes e um alto acoplamento e claro essa classe não tem as propriedade sendo recebidas por construtor o que vocês

Classe exemplo:

<?php

use ...
class SomeClass
{
    private AnotherClass $anotherClass;

    public function __construct()
    {
        $this->anotherClass = new AnotherClass();
        //... another calls classes

    }

    public function someMethod(Type $args): SomeType
    {
        //... any business logic 
        $this->anotherClass->doIt();

        return $someType;
    }
}
Enter fullscreen mode Exit fullscreen mode

Pensam comigo terá um alto acoplamento e se for aceitar que essa classe seja enviada por parâmetro no seu construtor possa ser que quebre compatibilidade com outras classes que podem estar usando.

Imagina que anotherClass::doIt seja algo arriscado que se for chamado possa ter uma consequência grave por exemplo um update em massa para resolver esse problema você pode sobreescrever essa propriedade no seu test:


<?php

class SomeTest extends TestCase
{
    public function testAnywere(): void
    {
        $anotherClassMock = $this->getMockBuilder(AnotherClass::class)
            ->disableOriginalConstructor()
            ->getMock();
        $anotherClassMock
            ->method('doIt');

        $someClass = new SomeClass();
        $setSomeClassClosure = function ()  use ($anotherClassMock){
            $this->anotherClass = $anotherClassMock;
        };
        $doSetSomeClassClosure = $setSomeClassClosure
            ->bindTo($someClass, SomeClass::class);
        $doSetSomeClassClosure();

    }
}
Enter fullscreen mode Exit fullscreen mode

Obs: A ideia desta forma de testar é te dar poder para conseguir resolver algo legado e bastante arriscado, no geral o ideal seria uma reescrita deste método

Top comments (0)