Suppose I overwrite 'Magento\Sales\Model\Resource\Order\Collection' to 'SR\RewriteSales\Model\Resource\Order\Collection', code looks like
public function addFieldToFilter($field, $condition = null) { // custom condition applied here return parent::addFieldToFilter($field, $condition); }
Now I need some test case for 'AddFieldToFilter' method.
I create a file inside SR\RewriteSales\Test\Unit\Model\Resource\Order\CollectionTest.php
code looks like
class CollectionTest extends \PHPUnit_Framework_TestCase { /** * @var Collection|\PHPUnit_Framework_MockObject_MockObject */ protected $collection; /** * @var \Magento\Framework\DB\Select|\PHPUnit_Framework_MockObject_MockObject */ protected $select; protected function setUp() { $this->select = $this->getMockBuilder('Magento\Framework\DB\Select') ->disableOriginalConstructor() ->getMock(); $connection = $this->getMockBuilder('Magento\Framework\DB\Adapter\Pdo\Mysql') ->disableOriginalConstructor() ->getMock(); $connection->expects($this->any()) ->method('select') ->will($this->returnValue($this->select)); $resource = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\AbstractDb') ->disableOriginalConstructor() ->setMethods(['__wakeup', 'getReadConnection']) ->getMockForAbstractClass(); $resource->expects($this->any()) ->method('getReadConnection') ->will($this->returnValue($connection)); $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $arguments = $objectManagerHelper->getConstructArguments( 'SR\RewriteSales\Model\Resource\Order\Collection', ['resource' => $resource, 'connection' => $connection] ); $this->collection = $this->getMockBuilder('SR\RewriteSales\Model\Resource\Order\Collection') ->setConstructorArgs($arguments) ->setMethods(['addFilter', '_translateCondition', 'getMainTable', '__wakeup']) ->getMock(); } public function testAddFieldToFilter() { } }
It's come following error-> "RuntimeException: ObjectManager isn't initialized".
Is that possible to create some test case for overwrite class?
Best Answer
First of all better to do not mock class under test.
Second one, better to use plugins instead of class overwrite.
And last, you must pass all parameters of parent constructor to your class.
Simplest way to instantiate class is using objectMangerHelper