Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPUnit-模拟不同类中静态方法的返回值_Php_Phpunit_Static Methods - Fatal编程技术网

PHPUnit-模拟不同类中静态方法的返回值

PHPUnit-模拟不同类中静态方法的返回值,php,phpunit,static-methods,Php,Phpunit,Static Methods,可能重复: 我使用的是phpunit3.6.10,我似乎找不到一个很好的例子来模拟数据库中的静态方法。具体地说,我有一个方法a的类a—调用它a->a—它调用B::B,我需要模拟它的返回值 class A { function a() { return B::b(); } } class B { static function b() { return 5; } } a的测试功能应如下所示: class A_Test {

可能重复:

我使用的是phpunit3.6.10,我似乎找不到一个很好的例子来模拟数据库中的静态方法。具体地说,我有一个方法a的类a—调用它a->a—它调用B::B,我需要模拟它的返回值

class A {
    function a() {
        return B::b();
    }
}

class B {
    static function b() {
        return 5;
    }
}
a的测试功能应如下所示:

class A_Test {
    function test_a() {
        // what should the code look like here?
    }
}

因为我们纯粹是测试A->A返回B::B,所以我们不关心B::B是如何工作的,所以我们可以模拟B::B的返回值,比如,返回'foo',并检查调用A->A时是否返回'foo'。如何做到这一点?

有没有一种方法可以编写测试而不必重构代码?您不必重构任何东西。您只需使用staticExpects设置B的期望值。静态方法调用本质上很难测试,而且它们通常是一种代码味道,即您在被测试的类和提供静态方法的类之间存在紧密耦合。由于这些原因,现在通常不赞成使用statics。要在这里使用staticExpects,A::A必须调用MockB::b。静态期望是为方法在其自己的类(例如self::foo)上调用静态方法而设计的。将该调用更改为static::foo允许您模拟它。@DavidHarkness那么您是说不可能模拟从A->A到B::B的调用?有没有一种方法可以测试a->a,而不必重构代码?如果没有,你会提出什么解决方案?