PHPUnit-模拟不同类中静态方法的返回值
可能重复: 我使用的是phpunit3.6.10,我似乎找不到一个很好的例子来模拟数据库中的静态方法。具体地说,我有一个方法a的类a—调用它a->a—它调用B::B,我需要模拟它的返回值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 {
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,而不必重构代码?如果没有,你会提出什么解决方案?