我不明白为什么不对我的方法进行模拟,因为该方法确实运行,并且不想使用模拟值返回。 (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值返回?
答案 0 :(得分:4)
这是因为您无法模拟这样的私有方法。要回答您的问题,您仍然可以通过更改方法的可见性来执行此操作:
$method = new ReflectionMethod('Object', 'method2');
$method->setAccessible(true);
虽然我不建议测试私有方法。您应该尝试模拟此类的依赖项以返回所需内容。模拟私有方法通常意味着类的逻辑存在问题。
我也不建议更改原始类中方法的可见性,因为您永远不应该更改代码只是为了让测试更快乐。如果某个方法是私有的,则没有任何理由将其更改为受保护或公开。