apenas dentro de uma classe, e normalmente, so existem para diminiur a complexidade de outros metodos, que na maioria das vezes sao publicos. Este metodos privados devem ser cobertos por testes pela sua chamada publica, que no caso sao os metodos publicos.Neste exemplo nao irei focar na complexidade, e sim, em como testar um metodo privado.....vamos la!!!Dada a seguinte classe:<?phpclass Seiya{ const ARMADURA_DE_PEGASUS = 'Pegasus'; const ARMADURA_DE_SAGITARIO = 'Sagitario'; private $armaduraAtual; private $cosmo; public function __construct() { $this->cosmo = 100; } public function invocaArmadura() { $this->armaduraAtual = $this->escolheArmadura(); } /** * @param int $dano */ public function defender($dano) { $this->cosmo -= $dano; if ($this->cosmo <= 0) { $this->despertarSetimoSentido(); } } private function despertarSetimoSentido() { $this->cosmo = 10000; $this->invocaArmadura(); } /** * @return string */ private function escolheArmadura() { if ($this->cosmo <= 100) { return self::ARMADURA_DE_PEGASUS; } else { return self::ARMADURA_DE_SAGITARIO; } } public function getCosmo() { return $this->cosmo; } public function setCosmo($cosmo) { $this->cosmo = $cosmo; }}Como podem ver, a classe Seiya, tem diversos metodos, mas iremos focar no metodo escolheArmadura(), que e privado.O metodo escolheArmadura() depende do valor de um atributo da classe, que e o cosmo, dependendo do valor, ele ira retornar uma armadura.Vamos ao teste (PRIMEIRA VERSAO)!!!<?phprequire ZF2_PATH. '/module/Tutorial/src/Tutorial/Seiya.php';class SeiyaTest extends PHPUnit_Framework_TestCase{ public function testEscolheArmadura() { $expected = 'Pegasus'; $seiya = new Seiya(); $seiya->setCosmo(100); $objReflection = new ReflectionClass('Seiya'); $method = $objReflection->getMethod('escolheArmadura'); $method->setAccessible(true); $result = $method->invoke($seiya); $this->assertEquals($expected, $result); }}Para podermos invocar um metodo privado temos que usar o resurso Reflection, que pode ler e alterar a visibilidade de um metodo.Desta forma acabamos de testar a seguinte situacao: quando o valor do cosmo e igual a 100, o metodo deve retornar: "Pegasus", mas nao podemos nos limitar a esta situacao, vamos aumentar a cobertura deste metodo....public function testEscolheArmadura() { $expected = 'Pegasus'; $seiya = new Seiya(); $seiya->setCosmo(100); $objReflection = new ReflectionClass('Seiya'); $method = $objReflection->getMethod('escolheArmadura'); $method->setAccessible(true); $result = $method->invoke($seiya); $this->assertEquals($expected, $result); // nova implementacao $expected = 'Sagitario'; $seiya = new Seiya(); $seiya->setCosmo(1000); $objReflection = new ReflectionClass('Seiya'); $method = $objReflection->getMethod('escolheArmadura'); $method->setAccessible(true); $result = $method->invoke($seiya); $this->assertEquals($expected, $result); }Agora tambem estamos validando se com o valor 1000 para o atributo cosmo, ele ira retornar "Sagitario".Se continuarmos aumentando a cobertura desta forma, nosso teste ira ficar muito extenso e com muito codigo duplicado. Para isso, existem os DataProviders.DataProviders sao conjuntos de dados que serao utilizados como entrada para um teste e o proprio PHPUnit cuida de realizar as iteracoes de laco para cada cenario.Agora o teste final.<?phprequire ZF2_PATH. '/module/Tutorial/src/Tutorial/Seiya.php';class SeiyaTest extends PHPUnit_Framework_TestCase{ /** * @dataProvider providerTestEscolheArmadura */ public function testEscolheArmadura($cosmo, $expected) { $seiya = new Seiya(); $seiya->setCosmo($cosmo); $objReflection = new ReflectionClass('Seiya'); $method = $objReflection->getMethod('escolheArmadura'); $method->setAccessible(true); $result = $method->invoke($seiya); $this->assertEquals($expected, $result); } public static function providerTestEscolheArmadura() { $pegasus = 'Pegasus'; $sagitario = 'Sagitario'; return array( array(1, $pegasus), array(100, $pegasus), array(0, $pegasus), array(101, $sagitario), array(1000, $sagitario), ); }}Pronto com DataProvider podemos utilizar o mesmo codigo com varios cenarios.Entendendo...O cada cenario do DataProvider e injetado no metodo de teste como argumento. Se observarmos o primeiro cenario, onde temos: 1, $pegasus('Pegasus'), estes dois parametros irao ser setados no metodo de teste.Bom pessoal, por enquanto e isso...um abraco e fiquem ligados