public function testMiddlewareCanBeAddedLater() { $executionOrder = []; $middleware1 = Mockery::mock(Middleware::class); $middleware1->shouldReceive('execute')->andReturnUsing(function ($command, $next) use(&$executionOrder) { $executionOrder[] = 1; return $next($command); }); $middleware2 = Mockery::mock(Middleware::class); $middleware2->shouldReceive('execute')->andReturnUsing(function ($command, $next) use(&$executionOrder) { $executionOrder[] = 2; return $next($command); }); $middleware3 = Mockery::mock(Middleware::class); $middleware3->shouldReceive('execute')->andReturnUsing(function () use(&$executionOrder) { $executionOrder[] = 3; return 'foobar'; }); $commandBus = new CommandBus(); $commandBus->prependMiddlewareChain($middleware3); $commandBus->prependMiddlewareChain($middleware2); $commandBus->prependMiddlewareChain($middleware1); $this->assertEquals('foobar', $commandBus->handle(new AddTaskCommand())); $this->assertEquals([1, 2, 3], $executionOrder); }