Mockery 中的重载和别名有啥区别?

Posted

技术标签:

【中文标题】Mockery 中的重载和别名有啥区别?【英文标题】:What is the difference between overload and alias in Mockery?Mockery 中的重载和别名有什么区别? 【发布时间】:2015-09-22 01:07:52 【问题描述】:

我不熟悉使用 Mockery 并且对术语 aliasoverload 感到困惑。谁能给我解释一下什么时候用哪个?

【问题讨论】:

【参考方案1】:

我发现了这个: https://github.com/padraic/mockery-docs/blob/master/reference/startup_methods.rst

$mock = \Mockery::mock('alias:MyNamespace\MyClass');

使用“alias:”为类的有效名称(当前未加载)添加前缀将生成“别名模拟”。别名模拟使用给定的类名创建一个类别名到 stdClass,通常用于启用公共静态方法的模拟。对这个类的所有静态调用都将使用在新模拟对象上设置的引用静态方法的期望。

$mock = \Mockery::mock('overload:MyNamespace\MyClass');

使用“overload:”为类的有效名称(当前未加载)添加前缀将生成一个别名模拟(与“alias:”一样),但创建的该类的新实例将导入任何期望在原始模拟 ($mock) 上设置。原始模拟从未被验证,因为它为新实例使用了期望存储。为此,我们使用术语“实例模拟”来将其与更简单的“别名模拟”区分开来。

所以在我看来,重载与别名的作用相同,不同之处在于它还从原始模拟导入期望。

【讨论】:

【参考方案2】:

Overload 用于创建“实例模拟”。当创建一个类的新实例时,这将“拦截”并且将使用模拟。例如,如果要测试此代码:

class ClassToTest 

    public function methodToTest()
    
        $myClass = new MyClass();
        $result = $myClass->someMethod();
        return $result;
    

您将使用overload 创建一个模拟实例并定义如下期望:

 public function testMethodToTest()
 
     $mock = Mockery::mock('overload:MyClass');
     $mock->shouldreceive('someMethod')->andReturn('someResult');

     $classToTest = new ClassToTest();
     $result = $classToTest->methodToTest();

     $this->assertEquals('someResult', $result);
 

Alias 用于模拟公共静态方法。例如,如果要测试此代码:

class ClassToTest 

    public function methodToTest()
    
        return MyClass::someStaticMethod();
    

您将使用 alias 创建一个别名模拟并定义如下期望:

public function testNewMethodToTest()

    $mock = Mockery::mock('alias:MyClass');
    $mock->shouldreceive('someStaticMethod')->andReturn('someResult');

    $classToTest = new ClassToTest();
    $result = $classToTest->methodToTest();

    $this->assertEquals('someResult', $result);

【讨论】:

谢谢弗雷德里克!

以上是关于Mockery 中的重载和别名有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

java中重载有啥用

重载和覆写有啥区别?

重载和重写有啥区别

方法重载和覆盖有啥区别? [复制]

ava的方法重载和方法重写有啥区别?举个例子?

C++中赋值运算操作符和=重载有啥区别?