如何在方法-phpunit中模拟新对象

如何在方法-phpunit中模拟新对象,php,mocking,phpunit,Php,Mocking,Phpunit,我正在用phpunit测试php代码,我遇到了一个问题: 我正在测试课程: class ClassName { public function MethodName() { // something $objectName = new Object(); $variableName = $objectName->execute(); // something } } 我要创建对象的模拟。我不想调用实方法execute()。我不知道如何用ph

我正在用phpunit测试php代码,我遇到了一个问题:

我正在测试课程:

class ClassName
{
  public function MethodName()
  {
    // something

    $objectName = new Object();
    $variableName = $objectName->execute();

    // something
  }
}
我要创建对象的模拟。我不想调用实方法execute()。我不知道如何用phpunit来做这件事。 我知道依赖注入,但依我看,依赖注入并不能解决这个问题


谢谢你的回答。我为我的英语感到抱歉。

事实上,这个案子可以通过依赖注射来解决。假设您不是在MethodName内实例化对象,而是注入它。无论是通过constructor、setter还是方法,对于原则来说都没有多大关系

class ClassName
{
    public function MethodName(Object $objectName)
    {
        // something

        $variableName = $objectName->execute();

        // something
    }
}
因为现在不在要测试的方法中实例化对象,所以可以在需要测试时向其传递模拟

public function testMethodName(){
    $mock = $this->getMockBuilder('Object')->getMock();

    $className = new ClassName;

    $result = $className->MethodName($mock);

    $this->assertTrue($result);
}

我没有运行这个testmethod,但我认为它说明了依赖注入的可测试性。

我自己也不是专家。我确实认为编写测试也会使代码本身更干净,因为您可以更好地考虑其结构。这些都是很好的一般性谈话,对于青春痘和其他伟大项目的创造者的依赖性注射论点……我认为这种策略并不总是合适的。例如,如果需要在测试中的方法中创建的对象类似于\DateTime()。或者传递给事件调度器的事件对象。它确实取决于情况。模式和最佳实践不是法律,也不是100%适用的。在如何优雅地解决问题方面,他们通常能很好地处理问题。尽管如此,有时使用依赖注入仍然是有意义的。但不是对象实例本身,而是注入一个生成器或工厂。