Dokładnie rozumiem ze OOP to interfejsy i ze klient widzi tylko publiczny interfejs. Chodziło mi po prostu o unikniecie pośredniego testowania i możliwość utworzenia w teście bezpośredniego testowania metod protected lub private (nie chce tutaj skłamać i konfabulować ale gdzieś mi się obiło o oczy takie możliwości np w Junicie czyli fremeworku testowym dla javy, ale tutaj mogę się głęboko mylić więc mnie skorygujcie).
Bardzo podoba mi się jednak koncepcja testowania pośredniego i tak skonstruowania metody testowej aby sprawdzała ona od razu metodę prywatną lub chronioną.
Niekiedy jednak przydałaby by się możliwość za pomocą chociażby Reflection API sięgnięcia do metod chronionych i przetestowania jej bezpośrednio (bez zmian interfejsu klasy).
Moje pytanie poniekad nasunelo mi sie tez w wyniku testpwania Reflection API, ktore umozliwia dostep do metod statycznych (private, protected, public) i zwrot z nich wartosci. Natomiast juz nie umozliwia dostepu do niestatycznych metod. Newiem dlaczego tak jest bo jeszcze tego nie odnalazlem w dokumentacji, ale z grubsza wydaja mi sie to troche niekonsekwentne Przyklad ponizej:
<?php
class Example {
static protected
function printerProtected
() { echo "Jestem statyczna chroniona metoda\n"; }
static private function printerPrivate
() { echo "Jestem statyczna prywatna metoda\n"; }
public function printer () {
echo "Jestem publiczna nie statyczna metoda ktora sie nie wykona ERROR FATAL !!!\n"; }
}
try {
$class = new ReflectionClass('Example');
$method = $class->getMethod('printerProtected');
$closureFirst = $method->getClosure();
$closureFirst();
$class = new ReflectionClass('Example');
$method = $class->getMethod('printerPrivate');
$closureSecond = $method->getClosure();
$closureSecond();
echo Example
::printerPrivate(); //Fatal error
$class = new ReflectionClass('Example');
$method = $class->getMethod('printer');
$closure = $method->getClosure();
$closure(); //Fatal error
}
catch(Exception $e) {
}
?>
Pozdrawiam