How to mock test a web service in PHPUnit across multiple tests?

php, phpunit, soap, web-services

Solution

This isn't an ideal solution, but in your setup give the SOAP mock a "random" class name, for example

$this->_soapClient = $this->getMockFromWsdl( 'some.wsdl', 'SoapClient' . md5( time().rand() ) );

This ensures that at least when the setup is called you don't get that error.

Problem

I am attempting to test a web service interface class using PHPUnit. Basically, this class makes calls to a SoapClient object. I am attempting to test this class in PHPUnit using the `getMockFromWsdl` method described here: http://www.phpunit.de/manual/current/en/test-doubles.html#test-doubles.stubbing-and-mocking-web-services However, since I want to test multiple methods from this same class, every time I setup the object, I also have to setup the mock WSDL SoapClient object. This is causing a fatal error to be thrown: ``` Fatal error: Cannot redeclare class xxxx in C:\web\php5\PEAR\PHPUnit\Framework\TestCase.php(1227) : eval()'d code on line 15 ``` How can I use the same mock object across multiple tests without having to regenerate it off the WSDL each time? That seems to be the problem. -- Having been asked to post some code to look at, here's the setup method in the TestCase: ``` protected function setUp() { parent::setUp(); $this->client = new Client(); $this->SoapClient = $this->getMockFromWsdl( 'service.wsdl' ); $this->client->setClient($this->SoapClient); } ```

Original source