public function mockPipeCommands(array $pipelineConfig, Application $app, array $expectedFinalConfig = [], $expectAnyCalls = false)
 {
     $app->setConfig($expectedFinalConfig);
     $executionOrder = new \stdClass();
     $executionOrder->order = [];
     $mockedCommands = [];
     foreach ($pipelineConfig as $command => $config) {
         preg_match('/^([\\w:]+)(.*)/', $command, $match);
         list($match, $commandName, $description) = $match;
         $expectedFinalConfig = array_merge($expectedFinalConfig, $this->stripOutSpecialParams($config));
         $artifactKey = $commandName . '_artifact';
         $artifactValue = $commandName . '_artifact_value';
         $expectedFinalConfig[$artifactKey] = $artifactValue;
         if (!isset($mockedCommands[$commandName])) {
             $mockedCommands[$commandName] = [$this->mockCommand($app, $commandName), []];
         }
         $mockCommand = $mockedCommands[$commandName][0];
         $mockedCommands[$commandName][1][] = function () use($mockCommand, $artifactKey, $artifactValue, $commandName, &$executionOrder) {
             $mockCommand->set($artifactKey, $artifactValue);
             $executionOrder->order[] = $mockCommand->getName();
         };
     }
     // lets aggregate all the calls to doExecute for each command
     foreach ($mockedCommands as $mock) {
         list($mockCommand, $doExecuteCallbacks) = $mock;
         $mockCommand->expects($expectAnyCalls ? $this->any() : $this->exactly(count($doExecuteCallbacks)))->method('doExecute')->will($this->returnCallback(function () use($mockCommand, &$mockedCommands) {
             $callback = array_shift($mockedCommands[$mockCommand->getName()][1]);
             $callback();
         }));
         $app->add($mockCommand);
     }
     return [$executionOrder, $expectedFinalConfig];
 }