Php 我可以模拟我测试的类吗?

Php 我可以模拟我测试的类吗?,php,unit-testing,testing,phpunit,Php,Unit Testing,Testing,Phpunit,我有一门课是这样的: <?php class Apple { public function foo($arg1){ if ($arg1 == 0){ $this->bar($arg1); } } public function bar($arg){ //do something } } class AppleTest extends TestCase{ /**

我有一门课是这样的:

<?php
class Apple { 
    public function foo($arg1){
        if ($arg1 == 0){
            $this->bar($arg1);
        }
    }

    public function bar($arg){
        //do something
    }
}
class AppleTest extends TestCase{
    /**
     * it's unit test for method Apple::foo
     */
    public function testFoo(){
        $mock = $this->getMockBuilder('Apple')
            ->setMethods(['bar'])
            ->getMock();

        $mock->expects($this->once())
            ->method('bar')
            ->with($this->equalTo(0));

        $mock->foo(0);
    }
}

有人告诉我,我不能对正在测试的类使用mock。我被告知应该使用类的实例而不是它的mock,因为当我使用mock时,它不是实际的测试。有人能反驳吗。

不是你不能,而是你真的不应该。显然,通过示例测试,您可以模拟正在测试的对象

但这不一定是个好主意。这样做的问题是,您正在精确地指定代码应该是什么样子。这会使重构更加困难。假设bar函数需要更改,并且您希望将foo需要的功能移动到私有函数中。现在您的测试将失败,因为foo不再调用bar。在这种情况下,它应该通过,因为功能没有改变。这是单元测试的最大好处之一,您可以重构代码并确保事情仍然正常工作


但是,有时有必要模拟您正在测试的类。通常,这是当您试图为现有代码编写新的测试时,您无法将其重构为使用依赖项注入。然后,您将不得不模拟另一个函数以隔离对象。这并不理想,应该避免,但编写一个糟糕的测试可能比根本没有测试要好。

模拟用于外部依赖项。模拟您正在测试的类毫无意义,因为您实际上不会测试您编写的单元测试代码之外的任何内容