Skip to content

Commit c6025c4

Browse files
committed
33299: Eliminated AspectMock usage from SuiteGeneratorTest.php
1 parent 9dfd3e3 commit c6025c4

File tree

3 files changed

+289
-162
lines changed

3 files changed

+289
-162
lines changed

dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php

Lines changed: 134 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace tests\unit\Magento\FunctionalTestFramework\Suite;
79

8-
use AspectMock\Test as AspectMock;
10+
use Exception;
911
use Magento\FunctionalTestingFramework\Exceptions\TestReferenceException;
10-
use Magento\FunctionalTestingFramework\ObjectManager\ObjectManager;
12+
use Magento\FunctionalTestingFramework\ObjectManager;
1113
use Magento\FunctionalTestingFramework\ObjectManagerFactory;
14+
use Magento\FunctionalTestingFramework\Suite\Service\SuiteGeneratorService;
1215
use Magento\FunctionalTestingFramework\Suite\SuiteGenerator;
1316
use Magento\FunctionalTestingFramework\Suite\Generators\GroupClassGenerator;
1417
use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler;
@@ -18,41 +21,31 @@
1821
use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser;
1922
use Magento\FunctionalTestingFramework\Util\GenerationErrorHandler;
2023
use Magento\FunctionalTestingFramework\Util\Manifest\DefaultTestManifest;
24+
use ReflectionProperty;
2125
use tests\unit\Util\MagentoTestCase;
2226
use Magento\FunctionalTestingFramework\Util\Manifest\TestManifestFactory;
2327
use tests\unit\Util\SuiteDataArrayBuilder;
2428
use tests\unit\Util\TestDataArrayBuilder;
2529
use tests\unit\Util\TestLoggingUtil;
26-
use tests\unit\Util\MockModuleResolverBuilder;
2730

2831
class SuiteGeneratorTest extends MagentoTestCase
2932
{
30-
/**
31-
* Setup entry append and clear for Suite Generator
32-
*/
33-
public static function setUpBeforeClass(): void
34-
{
35-
AspectMock::double(SuiteGenerator::class, [
36-
'clearPreviousSessionConfigEntries' => null,
37-
'appendEntriesToConfig' => null
38-
]);
39-
}
40-
4133
/**
4234
* Before test functionality
4335
* @return void
4436
*/
45-
public function setUp(): void
37+
protected function setUp(): void
4638
{
4739
TestLoggingUtil::getInstance()->setMockLoggingUtil();
48-
$resolverMock = new MockModuleResolverBuilder();
49-
$resolverMock->setup();
5040
}
5141

5242
/**
53-
* Tests generating a single suite given a set of parsed test data
43+
* Tests generating a single suite given a set of parsed test data.
44+
*
45+
* @return void
46+
* @throws Exception
5447
*/
55-
public function testGenerateSuite()
48+
public function testGenerateSuite(): void
5649
{
5750
$suiteDataArrayBuilder = new SuiteDataArrayBuilder();
5851
$mockData = $suiteDataArrayBuilder
@@ -74,20 +67,23 @@ public function testGenerateSuite()
7467

7568
// parse and generate suite object with mocked data
7669
$mockSuiteGenerator = SuiteGenerator::getInstance();
77-
$mockSuiteGenerator->generateSuite("basicTestSuite");
70+
$mockSuiteGenerator->generateSuite('basicTestSuite');
7871

7972
// assert that expected suite is generated
8073
TestLoggingUtil::getInstance()->validateMockLogStatement(
8174
'info',
82-
"suite generated",
83-
['suite' => 'basicTestSuite', 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . "basicTestSuite"]
75+
'suite generated',
76+
['suite' => 'basicTestSuite', 'relative_path' => '_generated' . DIRECTORY_SEPARATOR . 'basicTestSuite']
8477
);
8578
}
8679

8780
/**
88-
* Tests generating all suites given a set of parsed test data
81+
* Tests generating all suites given a set of parsed test data.
82+
*
83+
* @return void
84+
* @throws Exception
8985
*/
90-
public function testGenerateAllSuites()
86+
public function testGenerateAllSuites(): void
9187
{
9288
$suiteDataArrayBuilder = new SuiteDataArrayBuilder();
9389
$mockData = $suiteDataArrayBuilder
@@ -108,22 +104,25 @@ public function testGenerateAllSuites()
108104
$this->setMockTestAndSuiteParserOutput($mockTestData, $mockData);
109105

110106
// parse and retrieve suite object with mocked data
111-
$exampleTestManifest = new DefaultTestManifest([], "sample" . DIRECTORY_SEPARATOR . "path");
107+
$exampleTestManifest = new DefaultTestManifest([], 'sample' . DIRECTORY_SEPARATOR . 'path');
112108
$mockSuiteGenerator = SuiteGenerator::getInstance();
113109
$mockSuiteGenerator->generateAllSuites($exampleTestManifest);
114110

115111
// assert that expected suites are generated
116112
TestLoggingUtil::getInstance()->validateMockLogStatement(
117113
'info',
118-
"suite generated",
119-
['suite' => 'basicTestSuite', 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . "basicTestSuite"]
114+
'suite generated',
115+
['suite' => 'basicTestSuite', 'relative_path' => '_generated' . DIRECTORY_SEPARATOR . 'basicTestSuite']
120116
);
121117
}
122118

123119
/**
124-
* Tests attempting to generate a suite with no included/excluded tests and no hooks
120+
* Tests attempting to generate a suite with no included/excluded tests and no hooks.
121+
*
122+
* @return void
123+
* @throws Exception
125124
*/
126-
public function testGenerateEmptySuite()
125+
public function testGenerateEmptySuite(): void
127126
{
128127
$testDataArrayBuilder = new TestDataArrayBuilder();
129128
$mockTestData = $testDataArrayBuilder
@@ -142,17 +141,20 @@ public function testGenerateEmptySuite()
142141
$this->setMockTestAndSuiteParserOutput($mockTestData, $mockData);
143142

144143
// set expected error message
145-
$this->expectExceptionMessage("Suite basicTestSuite is not defined in xml or is invalid");
144+
$this->expectExceptionMessage('Suite basicTestSuite is not defined in xml or is invalid');
146145

147146
// parse and generate suite object with mocked data
148147
$mockSuiteGenerator = SuiteGenerator::getInstance();
149-
$mockSuiteGenerator->generateSuite("basicTestSuite");
148+
$mockSuiteGenerator->generateSuite('basicTestSuite');
150149
}
151150

152151
/**
153-
* Tests generating all suites with a suite containing invalid test reference
152+
* Tests generating all suites with a suite containing invalid test reference.
153+
*
154+
* @return void
155+
* @throws TestReferenceException
154156
*/
155-
public function testInvalidSuiteTestPair()
157+
public function testInvalidSuiteTestPair(): void
156158
{
157159
// Mock Suite1 => Test1 and Suite2 => Test2
158160
$suiteDataArrayBuilder = new SuiteDataArrayBuilder();
@@ -198,9 +200,12 @@ public function testInvalidSuiteTestPair()
198200
}
199201

200202
/**
201-
* Tests generating all suites with a non-existing suite
203+
* Tests generating all suites with a non-existing suite.
204+
*
205+
* @return void
206+
* @throws TestReferenceException
202207
*/
203-
public function testNonExistentSuiteTestPair()
208+
public function testNonExistentSuiteTestPair(): void
204209
{
205210
$testDataArrayBuilder = new TestDataArrayBuilder();
206211
$mockSimpleTest = $testDataArrayBuilder
@@ -227,9 +232,12 @@ public function testNonExistentSuiteTestPair()
227232
}
228233

229234
/**
230-
* Tests generating split suites for parallel test generation
235+
* Tests generating split suites for parallel test generation.
236+
*
237+
* @return void
238+
* @throws TestReferenceException
231239
*/
232-
public function testGenerateSplitSuiteFromTest()
240+
public function testGenerateSplitSuiteFromTest(): void
233241
{
234242
$suiteDataArrayBuilder = new SuiteDataArrayBuilder();
235243
$mockSuiteData = $suiteDataArrayBuilder
@@ -272,8 +280,8 @@ public function testGenerateSplitSuiteFromTest()
272280
// assert last split suite group generated
273281
TestLoggingUtil::getInstance()->validateMockLogStatement(
274282
'info',
275-
"suite generated",
276-
['suite' => 'mockSuite_1_G', 'relative_path' => "_generated" . DIRECTORY_SEPARATOR . "mockSuite_1_G"]
283+
'suite generated',
284+
['suite' => 'mockSuite_1_G', 'relative_path' => '_generated' . DIRECTORY_SEPARATOR . 'mockSuite_1_G']
277285
);
278286
}
279287

@@ -282,75 +290,117 @@ public function testGenerateSplitSuiteFromTest()
282290
*
283291
* @param array $testData
284292
* @param array $suiteData
285-
* @throws \Exception
293+
* @throws Exception
294+
*/
295+
private function setMockTestAndSuiteParserOutput(array $testData, array $suiteData): void
296+
{
297+
$this->clearMockResolverProperties();
298+
$mockSuiteGeneratorService = $this->createMock(SuiteGeneratorService::class);
299+
$mockSuiteGeneratorService
300+
->method('clearPreviousSessionConfigEntries')
301+
->willReturn(null);
302+
303+
$mockSuiteGeneratorService
304+
->method('appendEntriesToConfig')
305+
->willReturn(null);
306+
307+
$suiteGeneratorServiceProperty = new ReflectionProperty(SuiteGeneratorService::class, 'INSTANCE');
308+
$suiteGeneratorServiceProperty->setAccessible(true);
309+
$suiteGeneratorServiceProperty->setValue($mockSuiteGeneratorService);
310+
311+
$mockDataParser = $this->createMock(TestDataParser::class);
312+
$mockDataParser
313+
->method('readTestData')
314+
->willReturn($testData);
315+
316+
$mockSuiteDataParser = $this->createMock(SuiteDataParser::class);
317+
$mockSuiteDataParser
318+
->method('readSuiteData')
319+
->willReturn($suiteData);
320+
321+
$mockGroupClass = $this->createMock(GroupClassGenerator::class);
322+
$mockGroupClass
323+
->method('generateGroupClass')
324+
->willReturn('namespace');
325+
326+
$objectManager = ObjectManagerFactory::getObjectManager();
327+
328+
$objectManagerMockInstance = $this->createMock(ObjectManager::class);
329+
$objectManagerMockInstance
330+
->method('create')
331+
->will(
332+
$this->returnCallback(
333+
function (string $class, array $arguments = []) use (
334+
$mockDataParser,
335+
$mockSuiteDataParser,
336+
$mockGroupClass,
337+
$objectManager
338+
) {
339+
if ($class == TestDataParser::class) {
340+
return $mockDataParser;
341+
}
342+
if ($class == SuiteDataParser::class) {
343+
return $mockSuiteDataParser;
344+
}
345+
if ($class == GroupClassGenerator::class) {
346+
return $mockGroupClass;
347+
}
348+
349+
return $objectManager->create($class, $arguments);
350+
}
351+
)
352+
);
353+
354+
$objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance');
355+
$objectManagerProperty->setAccessible(true);
356+
$objectManagerProperty->setValue($objectManagerMockInstance);
357+
}
358+
359+
/**
360+
* Function used to clear mock properties.
361+
*
362+
* @return void
286363
*/
287-
private function setMockTestAndSuiteParserOutput($testData, $suiteData)
364+
private function clearMockResolverProperties(): void
288365
{
289-
$property = new \ReflectionProperty(SuiteGenerator::class, 'instance');
366+
$property = new ReflectionProperty(SuiteGenerator::class, 'instance');
290367
$property->setAccessible(true);
291368
$property->setValue(null);
292369

293370
// clear test object handler value to inject parsed content
294-
$property = new \ReflectionProperty(TestObjectHandler::class, 'testObjectHandler');
371+
$property = new ReflectionProperty(TestObjectHandler::class, 'testObjectHandler');
295372
$property->setAccessible(true);
296373
$property->setValue(null);
297374

298375
// clear suite object handler value to inject parsed content
299-
$property = new \ReflectionProperty(SuiteObjectHandler::class, 'instance');
376+
$property = new ReflectionProperty(SuiteObjectHandler::class, 'instance');
300377
$property->setAccessible(true);
301378
$property->setValue(null);
302-
303-
$mockDataParser = AspectMock::double(TestDataParser::class, ['readTestData' => $testData])->make();
304-
$mockSuiteDataParser = AspectMock::double(SuiteDataParser::class, ['readSuiteData' => $suiteData])->make();
305-
$mockGroupClass = AspectMock::double(
306-
GroupClassGenerator::class,
307-
['generateGroupClass' => 'namespace']
308-
)->make();
309-
$mockSuiteClass = AspectMock::double(SuiteGenerator::class, ['generateRelevantGroupTests' => null])->make();
310-
$instance = AspectMock::double(
311-
ObjectManager::class,
312-
['create' => function ($clazz) use (
313-
$mockDataParser,
314-
$mockSuiteDataParser,
315-
$mockGroupClass,
316-
$mockSuiteClass
317-
) {
318-
if ($clazz == TestDataParser::class) {
319-
return $mockDataParser;
320-
}
321-
if ($clazz == SuiteDataParser::class) {
322-
return $mockSuiteDataParser;
323-
}
324-
if ($clazz == GroupClassGenerator::class) {
325-
return $mockGroupClass;
326-
}
327-
if ($clazz == SuiteGenerator::class) {
328-
return $mockSuiteClass;
329-
}
330-
}]
331-
)->make();
332-
// bypass the private constructor
333-
AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]);
334-
335-
$property = new \ReflectionProperty(SuiteGenerator::class, 'groupClassGenerator');
336-
$property->setAccessible(true);
337-
$property->setValue($instance, $instance);
338379
}
339380

340381
/**
341-
* clean up function runs after each test
382+
* @inheritDoc
342383
*/
343-
public function tearDown(): void
384+
protected function tearDown(): void
344385
{
345386
GenerationErrorHandler::getInstance()->reset();
346387
}
347388

348389
/**
349-
* clean up function runs after all tests
390+
* @inheritDoc
350391
*/
351392
public static function tearDownAfterClass(): void
352393
{
353-
TestLoggingUtil::getInstance()->clearMockLoggingUtil();
354394
parent::tearDownAfterClass();
395+
396+
$objectManagerProperty = new ReflectionProperty(ObjectManager::class, 'instance');
397+
$objectManagerProperty->setAccessible(true);
398+
$objectManagerProperty->setValue(null);
399+
400+
$suiteGeneratorServiceProperty = new ReflectionProperty(SuiteGeneratorService::class, 'INSTANCE');
401+
$suiteGeneratorServiceProperty->setAccessible(true);
402+
$suiteGeneratorServiceProperty->setValue(null);
403+
404+
TestLoggingUtil::getInstance()->clearMockLoggingUtil();
355405
}
356406
}

0 commit comments

Comments
 (0)