@@ -150,25 +150,25 @@ class PHPUnit_Framework_MockObject_Generator
150
150
/**
151
151
* Returns a mock object for the specified class.
152
152
*
153
- * @param string $originalClassName
154
- * @param array $methods
155
- * @param array $arguments
156
- * @param string $mockClassName
157
- * @param boolean $callOriginalConstructor
158
- * @param boolean $callOriginalClone
159
- * @param boolean $callAutoload
160
- * @param boolean $cloneArguments
161
- * @param boolean $callOriginalMethods
162
- * @param object $proxyTarget
153
+ * @param array| string $type
154
+ * @param array $methods
155
+ * @param array $arguments
156
+ * @param string $mockClassName
157
+ * @param boolean $callOriginalConstructor
158
+ * @param boolean $callOriginalClone
159
+ * @param boolean $callAutoload
160
+ * @param boolean $cloneArguments
161
+ * @param boolean $callOriginalMethods
162
+ * @param object $proxyTarget
163
163
* @return object
164
164
* @throws InvalidArgumentException
165
165
* @throws PHPUnit_Framework_Exception
166
166
* @since Method available since Release 1.0.0
167
167
*/
168
- public function getMock ($ originalClassName , $ methods = array (), array $ arguments = array (), $ mockClassName = '' , $ callOriginalConstructor = TRUE , $ callOriginalClone = TRUE , $ callAutoload = TRUE , $ cloneArguments = TRUE , $ callOriginalMethods = FALSE , $ proxyTarget = NULL )
168
+ public function getMock ($ type , $ methods = array (), array $ arguments = array (), $ mockClassName = '' , $ callOriginalConstructor = TRUE , $ callOriginalClone = TRUE , $ callAutoload = TRUE , $ cloneArguments = TRUE , $ callOriginalMethods = FALSE , $ proxyTarget = NULL )
169
169
{
170
- if (!is_string ($ originalClassName )) {
171
- throw PHPUnit_Util_InvalidArgumentHelper::factory (1 , 'string ' );
170
+ if (!is_array ( $ type ) && ! is_string ($ type )) {
171
+ throw PHPUnit_Util_InvalidArgumentHelper::factory (1 , 'array or string ' );
172
172
}
173
173
174
174
if (!is_string ($ mockClassName )) {
@@ -215,7 +215,7 @@ public function getMock($originalClassName, $methods = array(), array $arguments
215
215
}
216
216
217
217
$ mock = $ this ->generate (
218
- $ originalClassName ,
218
+ $ type ,
219
219
$ methods ,
220
220
$ mockClassName ,
221
221
$ callOriginalClone ,
@@ -227,7 +227,7 @@ public function getMock($originalClassName, $methods = array(), array $arguments
227
227
return $ this ->getObject (
228
228
$ mock ['code ' ],
229
229
$ mock ['mockClassName ' ],
230
- $ originalClassName ,
230
+ $ type ,
231
231
$ callOriginalConstructor ,
232
232
$ callAutoload ,
233
233
$ arguments ,
@@ -237,22 +237,23 @@ public function getMock($originalClassName, $methods = array(), array $arguments
237
237
}
238
238
239
239
/**
240
- * @param string $code
241
- * @param string $className
242
- * @param string $originalClassName
243
- * @param boolean $callOriginalConstructor
244
- * @param boolean $callAutoload
245
- * @param array $arguments
246
- * @param boolean $callOriginalMethods
247
- * @param object $proxyTarget
240
+ * @param string $code
241
+ * @param string $className
242
+ * @param array| string $type
243
+ * @param boolean $callOriginalConstructor
244
+ * @param boolean $callAutoload
245
+ * @param array $arguments
246
+ * @param boolean $callOriginalMethods
247
+ * @param object $proxyTarget
248
248
* @return object
249
249
*/
250
- protected function getObject ($ code , $ className , $ originalClassName = '' , $ callOriginalConstructor = FALSE , $ callAutoload = FALSE , array $ arguments = array (), $ callOriginalMethods = FALSE , $ proxyTarget = NULL )
250
+ protected function getObject ($ code , $ className , $ type = '' , $ callOriginalConstructor = FALSE , $ callAutoload = FALSE , array $ arguments = array (), $ callOriginalMethods = FALSE , $ proxyTarget = NULL )
251
251
{
252
252
$ this ->evalClass ($ code , $ className );
253
253
254
254
if ($ callOriginalConstructor &&
255
- !interface_exists ($ originalClassName , $ callAutoload )) {
255
+ is_string ($ type ) &&
256
+ !interface_exists ($ type , $ callAutoload )) {
256
257
if (count ($ arguments ) == 0 ) {
257
258
$ object = new $ className ;
258
259
} else {
@@ -267,9 +268,9 @@ protected function getObject($code, $className, $originalClassName = '', $callOr
267
268
if ($ callOriginalMethods ) {
268
269
if (!is_object ($ proxyTarget )) {
269
270
if (count ($ arguments ) == 0 ) {
270
- $ proxyTarget = new $ originalClassName ;
271
+ $ proxyTarget = new $ type ;
271
272
} else {
272
- $ class = new ReflectionClass ($ originalClassName );
273
+ $ class = new ReflectionClass ($ type );
273
274
$ proxyTarget = $ class ->newInstanceArgs ($ arguments );
274
275
}
275
276
}
@@ -346,10 +347,7 @@ interface_exists($originalClassName, $callAutoload)) {
346
347
);
347
348
} else {
348
349
throw new PHPUnit_Framework_Exception (
349
- sprintf (
350
- 'Class "%s" does not exist. ' ,
351
- $ originalClassName
352
- )
350
+ sprintf ('Class "%s" does not exist. ' , $ originalClassName )
353
351
);
354
352
}
355
353
}
@@ -474,20 +472,24 @@ public function getObjectForTrait($traitName, array $arguments = array(), $trait
474
472
}
475
473
476
474
/**
477
- * @param string $originalClassName
478
- * @param array $methods
479
- * @param string $mockClassName
480
- * @param boolean $callOriginalClone
481
- * @param boolean $callAutoload
482
- * @param boolean $cloneArguments
483
- * @param boolean $callOriginalMethods
475
+ * @param array| string $type
476
+ * @param array $methods
477
+ * @param string $mockClassName
478
+ * @param boolean $callOriginalClone
479
+ * @param boolean $callAutoload
480
+ * @param boolean $cloneArguments
481
+ * @param boolean $callOriginalMethods
484
482
* @return array
485
483
*/
486
- public function generate ($ originalClassName , array $ methods = NULL , $ mockClassName = '' , $ callOriginalClone = TRUE , $ callAutoload = TRUE , $ cloneArguments = TRUE , $ callOriginalMethods = FALSE )
484
+ public function generate ($ type , array $ methods = NULL , $ mockClassName = '' , $ callOriginalClone = TRUE , $ callAutoload = TRUE , $ cloneArguments = TRUE , $ callOriginalMethods = FALSE )
487
485
{
486
+ if (is_array ($ type )) {
487
+ sort ($ type );
488
+ }
489
+
488
490
if ($ mockClassName == '' ) {
489
491
$ key = md5 (
490
- $ originalClassName .
492
+ is_array ( $ type ) ? join ( ' _ ' , $ type ) : $ type .
491
493
serialize ($ methods ) .
492
494
serialize ($ callOriginalClone ) .
493
495
serialize ($ cloneArguments ) .
@@ -500,7 +502,7 @@ public function generate($originalClassName, array $methods = NULL, $mockClassNa
500
502
}
501
503
502
504
$ mock = $ this ->generateMock (
503
- $ originalClassName ,
505
+ $ type ,
504
506
$ methods ,
505
507
$ mockClassName ,
506
508
$ callOriginalClone ,
@@ -518,13 +520,13 @@ public function generate($originalClassName, array $methods = NULL, $mockClassNa
518
520
519
521
/**
520
522
* @param string $wsdlFile
521
- * @param string $originalClassName
523
+ * @param string $className
522
524
* @param array $methods
523
525
* @param array $options
524
526
* @return string
525
527
* @throws PHPUnit_Framework_Exception
526
528
*/
527
- public function generateClassFromWsdl ($ wsdlFile , $ originalClassName , array $ methods = array (), array $ options = array ())
529
+ public function generateClassFromWsdl ($ wsdlFile , $ className , array $ methods = array (), array $ options = array ())
528
530
{
529
531
if ($ this ->soapLoaded === NULL ) {
530
532
$ this ->soapLoaded = extension_loaded ('soap ' );
@@ -588,16 +590,16 @@ public function generateClassFromWsdl($wsdlFile, $originalClassName, array $meth
588
590
589
591
$ namespace = '' ;
590
592
591
- if (strpos ($ originalClassName , '\\' ) !== FALSE ) {
592
- $ parts = explode ('\\' , $ originalClassName );
593
- $ originalClassName = array_pop ($ parts );
594
- $ namespace = 'namespace ' . join ('\\' , $ parts ) . '; ' ;
593
+ if (strpos ($ className , '\\' ) !== FALSE ) {
594
+ $ parts = explode ('\\' , $ className );
595
+ $ className = array_pop ($ parts );
596
+ $ namespace = 'namespace ' . join ('\\' , $ parts ) . '; ' ;
595
597
}
596
598
597
599
$ classTemplate ->setVar (
598
600
array (
599
601
'namespace ' => $ namespace ,
600
- 'class_name ' => $ originalClassName ,
602
+ 'class_name ' => $ className ,
601
603
'wsdl ' => $ wsdlFile ,
602
604
'options ' => $ optionsBuffer ,
603
605
'methods ' => $ methodsBuffer
@@ -614,33 +616,60 @@ public function generateClassFromWsdl($wsdlFile, $originalClassName, array $meth
614
616
}
615
617
616
618
/**
617
- * @param string $originalClassName
618
- * @param array|null $methods
619
- * @param string $mockClassName
620
- * @param boolean $callOriginalClone
621
- * @param boolean $callAutoload
622
- * @param boolean $cloneArguments
623
- * @param boolean $callOriginalMethods
619
+ * @param array| string $type
620
+ * @param array|null $methods
621
+ * @param string $mockClassName
622
+ * @param boolean $callOriginalClone
623
+ * @param boolean $callAutoload
624
+ * @param boolean $cloneArguments
625
+ * @param boolean $callOriginalMethods
624
626
* @return array
625
627
* @throws PHPUnit_Framework_Exception
626
628
*/
627
- protected function generateMock ($ originalClassName , $ methods , $ mockClassName , $ callOriginalClone , $ callAutoload , $ cloneArguments , $ callOriginalMethods )
629
+ protected function generateMock ($ type , $ methods , $ mockClassName , $ callOriginalClone , $ callAutoload , $ cloneArguments , $ callOriginalMethods )
628
630
{
629
631
$ templateDir = dirname (__FILE__ ) . DIRECTORY_SEPARATOR . 'Generator ' .
630
632
DIRECTORY_SEPARATOR ;
631
633
$ classTemplate = new Text_Template (
632
634
$ templateDir . 'mocked_class.tpl '
633
635
);
634
636
637
+
635
638
$ additionalInterfaces = array ();
636
- $ cloneTemplate = '' ;
637
- $ isClass = FALSE ;
638
- $ isInterface = FALSE ;
639
+ $ cloneTemplate = '' ;
640
+ $ isClass = FALSE ;
641
+ $ isInterface = FALSE ;
639
642
640
643
$ mockClassName = $ this ->generateClassName (
641
- $ originalClassName , $ mockClassName , 'Mock_ '
644
+ $ type , $ mockClassName , 'Mock_ '
642
645
);
643
646
647
+ if (is_array ($ type )) {
648
+ foreach ($ type as $ _type ) {
649
+ if (!interface_exists ($ _type , $ callAutoload )) {
650
+ throw new PHPUnit_Framework_Exception (
651
+ sprintf (
652
+ 'Interface "%s" does not exist. ' , $ _type
653
+ )
654
+ );
655
+ }
656
+
657
+ $ additionalInterfaces [] = $ _type ;
658
+
659
+ foreach (get_class_methods ($ _type ) as $ method ) {
660
+ if (in_array ($ method , $ methods )) {
661
+ throw new PHPUnit_Framework_Exception (
662
+ sprintf (
663
+ 'Duplicate method "%s" not allowed. ' , $ method
664
+ )
665
+ );
666
+ }
667
+
668
+ $ methods [] = $ method ;
669
+ }
670
+ }
671
+ }
672
+
644
673
if (class_exists ($ mockClassName ['fullClassName ' ], $ callAutoload )) {
645
674
$ isClass = TRUE ;
646
675
} else {
@@ -771,39 +800,43 @@ protected function generateMock($originalClassName, $methods, $mockClassName, $c
771
800
}
772
801
773
802
/**
774
- * @param string $originalClassName
775
- * @param string $className
776
- * @param string $prefix
803
+ * @param array| string $type
804
+ * @param string $className
805
+ * @param string $prefix
777
806
* @return array
778
807
*/
779
- protected function generateClassName ($ originalClassName , $ className , $ prefix )
808
+ protected function generateClassName ($ type , $ className , $ prefix )
780
809
{
781
- if ($ originalClassName [0 ] == '\\' ) {
782
- $ originalClassName = substr ($ originalClassName , 1 );
810
+ if (is_array ($ type )) {
811
+ $ type = join ('_ ' , $ type );
812
+ }
813
+
814
+ if ($ type [0 ] == '\\' ) {
815
+ $ type = substr ($ type , 1 );
783
816
}
784
817
785
- $ classNameParts = explode ('\\' , $ originalClassName );
818
+ $ classNameParts = explode ('\\' , $ type );
786
819
787
820
if (count ($ classNameParts ) > 1 ) {
788
- $ originalClassName = array_pop ($ classNameParts );
789
- $ namespaceName = join ('\\' , $ classNameParts );
790
- $ fullClassName = $ namespaceName . '\\' . $ originalClassName ;
821
+ $ type = array_pop ($ classNameParts );
822
+ $ namespaceName = join ('\\' , $ classNameParts );
823
+ $ fullClassName = $ namespaceName . '\\' . $ type ;
791
824
} else {
792
825
$ namespaceName = '' ;
793
- $ fullClassName = $ originalClassName ;
826
+ $ fullClassName = $ type ;
794
827
}
795
828
796
829
if ($ className == '' ) {
797
830
do {
798
- $ className = $ prefix . $ originalClassName . '_ ' .
831
+ $ className = $ prefix . $ type . '_ ' .
799
832
substr (md5 (microtime ()), 0 , 8 );
800
833
}
801
834
while (class_exists ($ className , FALSE ));
802
835
}
803
836
804
837
return array (
805
838
'className ' => $ className ,
806
- 'originalClassName ' => $ originalClassName ,
839
+ 'originalClassName ' => $ type ,
807
840
'fullClassName ' => $ fullClassName ,
808
841
'namespaceName ' => $ namespaceName
809
842
);
0 commit comments