2016-08-22 3 views
7

システムをPHP7.0にアップグレードしました。 4.8はPHP7を正しくサポートしていないため、PHPUnitを5.5にアップグレードする必要がありました。 これは、今は私たちが私たちのモックを構築する方法をリファクタリングする1200+ユニットテストに触れなければならないことであるように見える何PHPUnitを4.8から5.5にアップグレード

PHPUnit_Framework_TestCase::getMock() is deprecated, 
use PHPUnit_Framework_TestCase::createMock() or 
PHPUnit_Framework_TestCase::getMockBuilder() instead 

たちのCIにPHPUnitの失敗をネット次のエラーを生成します。

警告を表示しないようにする方法がありますか、またはgetMockの使用をcreateMockにすばやく変換します。これは、グローバル検索/置換によって切り捨てられないように動作するようです。

+0

アダプターと呼ばれるパターンがあります。それを見てみましょう。 – jaro1989

+0

廃止を非表示にするエラー報告を設定しますか? 'error_reporting(E_ALL&〜E_DEPRECATED);' http://php.net/function.error-reporting –

+0

@GerardRoche私は、廃止予定を隠すことは悪い考えだと思います。我々はできるだけ最新のものにするために努力しています。それは単に問題を避けることです。 – jaro1989

答えて

5

あなたは次にあなたはこのクラスからあなたのすべてのテストを拡張する必要があるPHPUnit_Framework_TestCaseを

class TestAdapter extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * Override your deprecated method 
    */ 
    public function getMock() 
    { 
     return $this->createMock(); 
    } 
} 

を拡張しますTestAdapterと呼ばれる追加のテストクラスを作成することができます。

+0

'getMock()'が使用されていないことは明らかにdeprecatedとマークされているので、文字通り 'TestCase :: getMock()'をフォールトなしで 'TestAdapter'クラスにコピーすることができます。確かに、それはそれを非難するための動機が何であってもそれに反しているようです。 – Umbrella

+0

また、この追加レイヤーからいくつかの利点があります。複製したコードをその中に移動し、必要に応じて分離することができます。それは同じオブジェクトを嘲笑し、ダミーのデータ配列などを作成することです。UnitTestHelperという名前をつけて後悔することは決してありません。 – jaro1989

+0

このようなクラスがあったので、当時私には起こりませんでしたこの中間クラスは私たちが 'getMock()'呼び出しを行っていた場所で、これは(MockBuilderを使っている)すべてのテストがこの警告を出す理由です。これは、この解決策を単純なものにするだけでなく、明らかにしておくべきでもあります。 – Umbrella

0

私の昔のテストのための次の作品は...

/** 
* Returns a mock object for the specified class. 
* 
* This method is a temporary solution to provide backward compatibility for tests that are still using the old 
* (4.8) getMock() method. 
* We should update the code and remove this method but for now this is good enough. 
* 
* 
* @param string  $originalClassName  Name of the class to mock. 
* @param array|null $methods     When provided, only methods whose names are in the array 
*           are replaced with a configurable test double. The behavior 
*           of the other methods is not changed. 
*           Providing null means that no methods will be replaced. 
* @param array  $arguments    Parameters to pass to the original class' constructor. 
* @param string  $mockClassName   Class name for the generated test double class. 
* @param bool  $callOriginalConstructor Can be used to disable the call to the original class' constructor. 
* @param bool  $callOriginalClone  Can be used to disable the call to the original class' clone constructor. 
* @param bool  $callAutoload   Can be used to disable __autoload() during the generation of the test double class. 
* @param bool  $cloneArguments 
* @param bool  $callOriginalMethods 
* @param object  $proxyTarget 
* 
* @return \PHPUnit_Framework_MockObject_MockObject 
* 
* @throws \Exception 
*/ 
public function getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false, $proxyTarget = null) 
{ 
    $builder = $this->getMockBuilder($originalClassName); 

    if (is_array($methods)) { 
     $builder->setMethods($methods); 
    } 

    if (is_array($arguments)) { 
     $builder->setConstructorArgs($arguments); 
    } 

    $callOriginalConstructor ? $builder->enableOriginalConstructor() : $builder->disableOriginalConstructor(); 
    $callOriginalClone ? $builder->enableOriginalClone() : $builder->disableOriginalClone(); 
    $callAutoload ? $builder->enableAutoload() : $builder->disableAutoload(); 
    $cloneArguments ? $builder->enableOriginalClone() : $builder->disableOriginalClone(); 
    $callOriginalMethods ? $builder->enableProxyingToOriginalMethods() : $builder->disableProxyingToOriginalMethods(); 

    if ($mockClassName) { 
     $builder->setMockClassName($mockClassName); 
    } 

    if ($proxyTarget) { 
     $builder->setProxyTarget($proxyTarget); 
    } 

    $mockObject = $builder->getMock(); 

    return $mockObject; 
} 
関連する問題