PHPunit 方法模拟不起作用

PHPunit method mocking does not work

我不明白为什么我的方法 mocking 不起作用,因为方法 运行 确实存在,并且不想 return 具有 mocked 值。 (交响乐)

    $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 从来没有 return 具有 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 被模拟并且 returns 具有 9 个值?

发生这种情况是因为您不能像这样模拟私有方法。要回答您的问题,您仍然可以通过更改方法的可见性来回答:

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

尽管我不建议测试私有方法。您应该尝试模拟此 class 对 return 的依赖关系。模拟私有方法通常意味着 class.

的逻辑有问题

我也不建议在原始 class 中更改方法的可见性,因为您永远不应该为了让测试满意而更改代码。如果一个方法在其他方面是私有的,则没有单一的理由将其更改为受保护或 public.