如何调用Class :: function得到Mock :: function响应

时间:2016-11-29 14:54:48

标签: php mocking phpunit

我正在进行单元测试,并尝试替换类函数返回的值,该函数在我的单元测试的其他地方调用。

我开始研究Mock对象,这似乎是我的解决方案。 这是我正在使用的代码:

<?php

namespace A;

class SomeClass
{
    public function doSomething()
    {
        return 20;
    }
}

/**
 * @group DaTest
 */
class DaTest extends \PHPUnit_Framework_TestCase
{
    public function testStub()
    {
        // Create a stub for the SomeClass class.
        $stub = $this
            ->getMock('A\SomeClass', array('doSomething'))
        ;

        // Configure the stub.
        $stub
            ->expects($this->any())
            ->method('doSomething')
            ->willReturn(1)
        ;

        $a = new SomeClass();

        var_dump($stub->doSomething)); // Return 1
        var_dump($a->doSomething());   // Return 20 -.-'
    }
}

正如你所看到的,我觉得我被迫使用Mock来获得“1”。 但我的目标是使SomeClass的任何实例返回1,但仅用于我的单元测试。

我错过了什么? 关于如何实现这个目标的任何想法?

THX。

编辑: 为了准确显示我正在尝试做的事情,我得到了另一个代码:

<?php

namespace A;

class SomeClass2
{
    public function showSomething()
    {
        $class = new SomeClass();
        // Here print 20, I want it to print 1 in my unit test
        echo $class->doSomething();
    }
}

我想要的是在我的单元测试中获得SomeClass2::showSomething()打印1,在非测试环境中调用它时获得20; =

1 个答案:

答案 0 :(得分:1)

所以你需要做的是将someClass的实例作为showSomething()函数的参数注入。因此,您将能够模拟SomeClass

<?php

namespace A;

class SomeClass2
{
    public function showSomething(SomeClass $classInstance)
    {
        echo $classInstance->doSomething();
    }
}