如何使用phpunit 4.6.6及更高版本模拟静态函数

时间:2015-10-16 02:25:07

标签: php mocking phpunit

我知道自PHPExit 3.8起不推荐使用staticExpects,并且将在以后的版本中完全删除。 但是在我们的项目中,到处使用静态函数。所以,制作phpunit是个大问题。在我们的开发中,phpunit版本是4.6.6,我不能回到3.8。 我的问题是我怎么能像staticExpects一样? 代码:

class A {
    public static function staticfun(){
       //dosomething....     
    }
}
class B {
    public static function callA(){
       A::staticfun();
    }

}

class TestA extends PHPUnit_Framework_TestCase{
    public function test(){
        //I want to mock staticfun()
        B::callA();

    }
}

2 个答案:

答案 0 :(得分:1)

要做到这一点,您需要使用像uopz这样的扩展程序,它允许您在运行时重新定义函数和方法。

在您的测试课程中,您需要添加以下内容:

public static function setupBeforeClass()
{
    uopz_backup("A", "staticfun");
    uopz_function("A", "staticfun", function () {
        // do something else
    });
}

public static function tearDownAfterClass()
{
    uopz_restore("A", "staticfun");
}

此' 11:

  • 备份原始方法
  • 将其重新定义为给定的闭包
  • 在课程中的测试完成后恢复原文

答案 1 :(得分:0)

在一般情况下,您可以不模拟静态函数调用。如果您打算使用模拟测试软件,请不要使用静态调用。你可以试着捣蛋邪恶的伎俩,但这通常是一个巨大的痛苦。

您可能没有彻底阅读PHPUnit的staticExpects功能的文档。它没有做你需要的。 Sebastian在PHPUnit 3.5中实现了这个功能,但它没有像他想要的那样工作,因为人们并不了解它的局限性。所以它在3.8中再次删除。

面对使用静态调用创建不可测试软件的事实。开始抛弃它们并以这种方式提高软件的可测试性。这是痛苦的,会耗费时间,但这是唯一的方法。