2016-08-19 74 views
2

我有一個抽象基類的抽象保護方法嘲弄:嘲弄publicaly覆蓋保護的方法

abstract class AbstractSample 
{ 
    abstract protected function getConnection(); 
} 

和子類的,其中保護法被重新定義爲公衆:

class ConcreteSample extends AbstractSample 
{ 
    public function getConnection() 
    { 
     return 'connection resource'; 
    } 
} 

這是類我想測試:

class Caller 
{ 
    protected $_sample; 

    public function __construct(ConcreteSample $sample) 
    { 
     $this->_sample = $sample; 
    } 

    public function method() 
    { 
     $conn = $this->_sample->getConnection(); 
     return $conn; 
    } 
} 

和測試單元本身:

class Sample_Test extends \PHPUnit_Framework_TestCase 
{ 
    public function test_getConnection() 
    { 
     $RESOURCE = 'mocked resource'; 
     $mSample = \Mockery::mock(ConcreteSample::class); 
     $mSample 
      ->shouldReceive('getConnection')->once() 
      ->andReturn($RESOURCE); 
     $obj = new Caller($mSample); 
     $res = $obj->method(); 
     $this->assertEquals($RESOURCE, $res); 
    } 
} 

當我運行測試我有一個錯誤:

InvalidArgumentException : getConnection() cannot be mocked as it a protected method and mocking protected methods is not allowed for this mock 
/.../vendor/mockery/mockery/library/Mockery.php:670 
/.../vendor/mockery/mockery/library/Mockery.php:678 
/.../vendor/mockery/mockery/library/Mockery.php:629 
/.../var/tmp/Sample_Test.php:13 

我怎麼能嘲笑重新定義了保護方法在基類中的公共方法?嘲弄的版本是0.9.4

+1

有一個在GitHub上帕德里克/嘲弄的[問題](https://github.com/padraic/mockery/issues/497) 。 –

+0

dafuq? 「抽象保護功能」可以被「公共功能」覆蓋?我會拒絕這個拉請求... – iRaS

+0

這是嘲笑中的錯誤,它在開發分支中得到了修復。最後一個版本是0.9.5,它受到影響。 –

回答

1

你可以試試這個:

$mSample = \Mockery::mock(ConcreteSample::class) 
      ->shouldAllowMockingProtectedMethods();