1.1. Dummies
Los dummies son dobles que no tienen comportamiento. Esto quiere decir que todos sus métodos (públicos) devuelven null. En algún lugar se sugiere que deberían devolver una excepción para el caso de que la unidad bajo test utilice esos métodos. Sin embargo, que el dummy lance una excepción, aunque sea para protestar por el uso, no deja de ser un comportamiento, que además es exclusivamente técnico, y no me parece una buena práctica.
Nos interesa que los dummies devuelvan null. Eso quiere decir que no tienen comportamiento y, por lo tanto, no pueden influir en la respuesta o efecto de la unidad bajo test. Cuando la unidad bajo test u otro colaborador necesiten utilizar la respuesta de estos dummies protestarán por haber recibido un null en vez del tipo de valor esperado.
Se podría objetar que en algunos casos devolver null sería un comportamiento adecuado de un colaborador, o al menos un comportamiento posible, por lo que el resultado de un posible test podría ser confuso.
En este caso, si esta situación te supone realmente un problema puede que debas reconsiderar si es adecuado para tu caso de uso que se pueda usar ese dato como null y si no sería mejor lanzar una excepción en su lugar.
Los dummies normalmente se utilizan para poder construir el objeto que vamos a testear. Normalmente en construcción no necesitaremos ejecutar ninguno de sus métodos, simplemente asignarlos a los miembros adecuados de la clase bajo test. A continuación, tienes un ejemplo de un setUp en el que se instancia un objeto de la clase que vamos a testear y se le pasan varios colaboradores dummies:
1 protected function setUp()
2 {
3 $this->finishRegister = $this->createMock(FinishRegister::class);
4 $this->cancelContract = $this->createMock(CancelContract::class);
5 $this->guessDocumentType = $this->createMock(GuessDocumentType::class);
6 $this->contractRepository = $this->createMock(ContractRepositoryInterface::class\
7 );
8
9 $this->createValidRegister = new CreateValidRegister(
10 $this->finishRegister,
11 $this->cancelContract,
12 $this->guessDocumentType,
13 $this->contractRepository
14 );
15 }
Un dummy también podría ser un argumento que pasamos a la unidad bajo test:
1 $contract = $this->createMock(Contract::class);
2
3 $response = $sendContract->send($customer, $contract);
4
5 $this->assertEquals(Response::OK, $response);