PHPunit方法模拟不起作用

时间:2016-05-15 17:11:03

标签: symfony mocking phpunit

我不明白为什么不对我的方法进行模拟,因为该方法确实运行,并且不想使用模拟值返回。 (Symfony的)

    $this->mockedObject = $this
        ->getMockBuilder('Object')
        //->setConstructorArgs(array('em' => $this->entityManager, 'router' => $this->mockedRouter))
        ->disableOriginalConstructor()
        ->setMethods(array('method1', 'method2'))
        ->getMock();

    $this->mockedObject
        ->expects($this->once())
        ->method('method2')
        ->willReturn(9);

所以当你看到我模拟了method2,但是method2永远不会返回9值,因为它运行:

Error: Call to a member function createQueryBuilder() on null

这里是原始方法2:

   private function method2($repository) {
        $qb = $this->em->createQueryBuilder();
        $qb->select('count(e.id)');
        $qb->from($repository, 'e');
        return $qb->getQuery()->getSingleScalarResult();
    }

这就是问题所在,因为mockedObject使用createQueryBuilder方法调用method2()

如何实现 method2 被模拟并以9值返回?

1 个答案:

答案 0 :(得分:4)

这是因为您无法模拟这样的私有方法。要回答您的问题,您仍然可以通过更改方法的可见性来执行此操作:

$method = new ReflectionMethod('Object', 'method2');
$method->setAccessible(true);

虽然我不建议测试私有方法。您应该尝试模拟此类的依赖项以返回所需内容。模拟私有方法通常意味着类的逻辑存在问题。

我也不建议更改原始类中方法的可见性,因为您永远不应该更改代码只是为了让测试更快乐。如果某个方法是私有的,则没有任何理由将其更改为受保护或公开。