Test Failed
Branch main (917e6f)
by Chema
25:55 queued 22:47
created

ClassContainerTest   A

Complexity

Total Complexity 27

Size/Duplication

Total Lines 608
Duplicated Lines 0 %

Importance

Changes 5
Bugs 2 Features 3
Metric Value
eloc 277
c 5
b 2
f 3
dl 0
loc 608
rs 10
wmc 27

74 Methods

Rating   Name   Duplication   Size   Complexity  
test_service_not_extendable() 0 7 ?
A test_interface_dependency() 0 8 1
test_interface_binding_with_constructor_dependencies() 0 15 ?
test_resolve_service_as_callable_class() 0 18 ?
test_get_bindings() 0 10 ?
test_extend_existing_used_callable_service_then_error() 0 11 ?
A test_resolve_object_from_interface() 0 11 1
A hp$0 ➔ test_extend_existing_used_object_service_is_allowed() 0 11 1
A hp$0 ➔ test_extend_existing_callable_service() 0 23 1
test_extend_later_existing_frozen_callable_service_then_error() 0 16 ?
test_extend_later_existing_frozen_object_service_then_error() 0 16 ?
A hp$0 ➔ test_extend_later_existing_frozen_object_service_then_error() 0 16 1
A test_static_create_without_dependencies() 0 5 1
A test_has_not_existing_class() 0 6 1
A test_has_service() 0 7 1
test_set_after_extend() 0 15 ?
test_circular_dependency_three_classes() 0 6 ?
A test_resolve_object_from_instance_in_a_callable() 0 11 1
A hp$0 ➔ test_extend_non_existing_service() 0 6 1
test_extend_existing_factory_service() 0 28 ?
A test_remove_existing_service() 0 7 1
A hp$0 ➔ __invoke() 0 3 1
A hp$0 ➔ test_resolve_factory_service_with_random() 0 13 1
test_resolve_non_factory_service_with_random() 0 11 ?
test_extend_non_existing_service() 0 6 ?
test_extend_existing_callable_service() 0 23 ?
A hp$0 ➔ test_extend_existing_factory_service() 0 28 1
A hp$0 ➔ test_protect_service_cannot_be_extended() 0 13 1
A test_resolve_object_from_callable_classname_in_a_callable() 0 8 1
A test_resolve_service_as_function() 0 10 1
A test_without_dependencies() 0 6 1
A hp$0 ➔ test_is_frozen() 0 10 1
A test_static_create_with_many_dependencies() 0 5 1
A hp$0 ➔ test_circular_dependency_three_classes() 0 6 1
A hp$0 ➔ test_resolve_service_as_callable_class() 0 18 1
test_protect_service_is_not_resolved() 0 7 ?
A hp$0 ➔ test_get_bindings() 0 10 1
test_circular_dependency_two_classes() 0 6 ?
test_extend_existing_array_service() 0 24 ?
test_is_factory() 0 12 ?
A test_use_mapped_interface_dependency() 0 11 1
A test_static_create_class_with_inner_dependencies_with_many_dependencies() 0 5 1
A test_resolve_object_from_classname() 0 8 1
A hp$0 ➔ test_set_after_extend() 0 15 1
A hp$0 ➔ test_extend_later_existing_frozen_callable_service_then_error() 0 16 1
test_is_frozen() 0 10 ?
A test_interface_not_registered_returns_null() 0 8 1
A hp$0 ➔ test_warm_up_skips_non_existent_classes() 0 11 1
test_warm_up_skips_non_existent_classes() 0 11 ?
A hp$0 ➔ test_warm_up_caches_dependencies() 0 16 1
test_set_existing_frozen_service() 0 8 ?
A hp$0 ➔ test_extend_existing_used_callable_service_then_error() 0 11 1
test_extend_existing_used_object_service_is_allowed() 0 11 ?
test_protect_service_cannot_be_extended() 0 13 ?
A test_object_with_resolvable_dependencies() 0 6 1
A test_static_create_with_dependencies() 0 5 1
A test_resolve_service_as_raw_string() 0 10 1
A hp$0 ➔ test_set_existing_frozen_service() 0 8 1
A test_static_create_class_with_inner_dependencies_without_dependencies() 0 5 1
A hp$0 ➔ test_extend_existing_array_service() 0 24 1
A hp$0 ➔ test_extend_existing_object_service() 0 25 1
A hp$0 ➔ test_protect_service_is_not_resolved() 0 7 1
A hp$0 ➔ test_service_not_extendable() 0 7 1
A hp$0 ➔ test_resolve_non_factory_service_with_random() 0 11 1
test_get_registered_services() 0 9 ?
test_extend_existing_object_service() 0 25 ?
A test_resolve_new_object() 0 13 1
A hp$0 ➔ test_get_registered_services() 0 9 1
test_warm_up_caches_dependencies() 0 16 ?
A hp$0 ➔ test_circular_dependency_two_classes() 0 6 1
A hp$0 ➔ test_interface_binding_with_constructor_dependencies() 0 15 1
A hp$0 ➔ test_is_factory() 0 12 1
A test_get_non_existing_service() 0 5 1
test_resolve_factory_service_with_random() 0 13 ?
1
<?php
2
3
declare(strict_types=1);
4
5
namespace GacelaTest\Unit;
6
7
use ArrayObject;
8
use Gacela\Container\Container;
9
use Gacela\Container\Exception\CircularDependencyException;
10
use Gacela\Container\Exception\ContainerException;
11
use GacelaTest\Fake\CircularA;
12
use GacelaTest\Fake\CircularC;
13
use GacelaTest\Fake\ClassWithDependencyWithoutDependencies;
14
use GacelaTest\Fake\ClassWithInnerObjectDependencies;
15
use GacelaTest\Fake\ClassWithInterfaceDependencies;
16
use GacelaTest\Fake\ClassWithObjectDependencies;
17
use GacelaTest\Fake\ClassWithoutDependencies;
18
use GacelaTest\Fake\ClassWithRelationship;
19
use GacelaTest\Fake\DatabaseRepository;
20
use GacelaTest\Fake\Person;
21
use GacelaTest\Fake\PersonInterface;
22
use GacelaTest\Fake\RepositoryInterface;
23
use GacelaTest\Fake\ServiceWithRepository;
24
use PHPUnit\Framework\TestCase;
25
26
final class ClassContainerTest extends TestCase
27
{
28
    public function test_static_create_without_dependencies(): void
29
    {
30
        $actual = Container::create(ClassWithoutDependencies::class);
31
32
        self::assertEquals(new ClassWithoutDependencies(), $actual);
33
    }
34
35
    public function test_static_create_class_with_inner_dependencies_without_dependencies(): void
36
    {
37
        $actual = Container::create(ClassWithDependencyWithoutDependencies::class);
38
39
        self::assertEquals(new ClassWithDependencyWithoutDependencies(new ClassWithoutDependencies()), $actual);
40
    }
41
42
    public function test_static_create_class_with_inner_dependencies_with_many_dependencies(): void
43
    {
44
        $actual = Container::create(ClassWithInnerObjectDependencies::class);
45
46
        self::assertEquals(new ClassWithInnerObjectDependencies(new ClassWithRelationship(new Person(), new Person())), $actual);
47
    }
48
49
    public function test_static_create_with_dependencies(): void
50
    {
51
        $actual = Container::create(ClassWithObjectDependencies::class);
52
53
        self::assertEquals(new ClassWithObjectDependencies(new Person()), $actual);
54
    }
55
56
    public function test_static_create_with_many_dependencies(): void
57
    {
58
        $actual = Container::create(ClassWithRelationship::class);
59
60
        self::assertEquals(new ClassWithRelationship(new Person(), new Person()), $actual);
61
    }
62
63
    public function test_without_dependencies(): void
64
    {
65
        $container = new Container();
66
        $actual = $container->get(ClassWithoutDependencies::class);
67
68
        self::assertEquals(new ClassWithoutDependencies(), $actual);
69
    }
70
71
    public function test_object_with_resolvable_dependencies(): void
72
    {
73
        $container = new Container();
74
        $actual = $container->get(ClassWithObjectDependencies::class);
75
76
        self::assertEquals(new ClassWithObjectDependencies(new Person()), $actual);
77
    }
78
79
    public function test_interface_dependency(): void
80
    {
81
        $container = new Container([
82
            PersonInterface::class => Person::class,
83
        ]);
84
        $actual = $container->get(ClassWithObjectDependencies::class);
85
86
        self::assertEquals(new ClassWithObjectDependencies(new Person()), $actual);
87
    }
88
89
    public function test_use_mapped_interface_dependency(): void
90
    {
91
        $person = new Person();
92
        $person->name = 'anything';
93
94
        $container = new Container([
95
            PersonInterface::class => $person,
96
        ]);
97
        $actual = $container->get(ClassWithInterfaceDependencies::class);
98
99
        self::assertEquals(new ClassWithInterfaceDependencies($person), $actual);
100
    }
101
102
    public function test_has_not_existing_class(): void
103
    {
104
        $container = new Container();
105
        $actual = $container->has(InexistentClass::class);
106
107
        self::assertFalse($actual);
108
    }
109
110
    public function test_resolve_object_from_interface(): void
111
    {
112
        $person = new Person();
113
        $person->name = 'person-name';
114
115
        $container = new Container([
116
            PersonInterface::class => $person,
117
        ]);
118
        $resolvedPerson = $container->get(PersonInterface::class);
119
120
        self::assertSame($resolvedPerson, $person);
121
    }
122
123
    public function test_resolve_new_object(): void
124
    {
125
        // We are registering 'PersonInterface::class', but 'Person::class' was not.
126
        // As result, a 'new Person()' will be resolved.
127
        $person = new Person();
128
        $person->name = 'person-name';
129
130
        $container = new Container([
131
            PersonInterface::class => $person,
132
        ]);
133
        $resolvedPerson = $container->get(Person::class);
134
135
        self::assertEquals($resolvedPerson, new Person()); // different objects!
136
    }
137
138
    public function test_interface_not_registered_returns_null(): void
139
    {
140
        $container = new Container([
141
            Person::class => new Person(),
142
        ]);
143
        $resolvedPerson = $container->get(PersonInterface::class);
144
145
        self::assertNull($resolvedPerson);
146
    }
147
148
    public function test_resolve_object_from_classname(): void
149
    {
150
        $container = new Container([
151
            PersonInterface::class => Person::class,
152
        ]);
153
        $resolvedPerson = $container->get(PersonInterface::class);
154
155
        self::assertEquals($resolvedPerson, new Person());
156
    }
157
158
    public function test_resolve_object_from_instance_in_a_callable(): void
159
    {
160
        $person = new Person();
161
        $person->name = 'person-name';
162
163
        $container = new Container([
164
            PersonInterface::class => static fn () => $person,
165
        ]);
166
        $resolvedPerson = $container->get(PersonInterface::class);
167
168
        self::assertEquals($resolvedPerson, $person);
169
    }
170
171
    public function test_resolve_object_from_callable_classname_in_a_callable(): void
172
    {
173
        $container = new Container([
174
            PersonInterface::class => static fn () => Person::class,
175
        ]);
176
        $resolvedPerson = $container->get(PersonInterface::class);
177
178
        self::assertEquals($resolvedPerson, new Person());
179
    }
180
181
    public function test_get_non_existing_service(): void
182
    {
183
        $container = new Container();
184
185
        self::assertNull($container->get('unknown-service_name'));
186
    }
187
188
    public function test_has_service(): void
189
    {
190
        $container = new Container();
191
        $container->set('service_name', 'value');
192
193
        self::assertTrue($container->has('service_name'));
194
        self::assertFalse($container->has('unknown-service_name'));
195
    }
196
197
    public function test_remove_existing_service(): void
198
    {
199
        $container = new Container();
200
        $container->set('service_name', 'value');
201
        $container->remove('service_name');
202
203
        self::assertNull($container->get('service_name'));
204
    }
205
206
    public function test_resolve_service_as_raw_string(): void
207
    {
208
        $container = new Container();
209
        $container->set('service_name', 'value');
210
211
        $resolvedService = $container->get('service_name');
212
        self::assertSame('value', $resolvedService);
213
214
        $cachedResolvedService = $container->get('service_name');
215
        self::assertSame('value', $cachedResolvedService);
216
    }
217
218
    public function test_resolve_service_as_function(): void
219
    {
220
        $container = new Container();
221
        $container->set('service_name', static fn () => 'value');
222
223
        $resolvedService = $container->get('service_name');
224
        self::assertSame('value', $resolvedService);
225
226
        $cachedResolvedService = $container->get('service_name');
227
        self::assertSame('value', $cachedResolvedService);
228
    }
229
230
    public function test_resolve_service_as_callable_class(): void
231
    {
232
        $container = new Container();
233
        $container->set(
234
            'service_name',
235
            new class() {
236
                public function __invoke(): string
237
                {
238
                    return 'value';
239
                }
240
            },
241
        );
242
243
        $resolvedService = $container->get('service_name');
244
        self::assertSame('value', $resolvedService);
245
246
        $cachedResolvedService = $container->get('service_name');
247
        self::assertSame('value', $cachedResolvedService);
248
    }
249
250
    public function test_resolve_non_factory_service_with_random(): void
251
    {
252
        $container = new Container();
253
        $container->set(
254
            'service_name',
255
            static fn () => 'value_' . random_int(0, PHP_INT_MAX),
256
        );
257
258
        self::assertSame(
259
            $container->get('service_name'),
260
            $container->get('service_name'),
261
        );
262
    }
263
264
    public function test_resolve_factory_service_with_random(): void
265
    {
266
        $container = new Container();
267
        $container->set(
268
            'service_name',
269
            $container->factory(
270
                static fn () => 'value_' . random_int(0, PHP_INT_MAX),
271
            ),
272
        );
273
274
        self::assertNotSame(
275
            $container->get('service_name'),
276
            $container->get('service_name'),
277
        );
278
    }
279
280
    public function test_extend_existing_factory_service(): void
281
    {
282
        $container = new Container();
283
        $container->set('n3', 3);
284
        $container->set(
285
            'service_name',
286
            $container->factory(
287
                static fn () => new ArrayObject([1, 2]),
288
            ),
289
        );
290
291
        $container->extend(
292
            'service_name',
293
            static function (ArrayObject $arrayObject, Container $container): ArrayObject {
294
                $arrayObject->append($container->get('n3'));
295
296
                return $arrayObject;
297
            },
298
        );
299
300
        /** @var ArrayObject $first */
301
        $first = $container->get('service_name');
302
        /** @var ArrayObject $second */
303
        $second = $container->get('service_name');
304
305
        self::assertEquals(new ArrayObject([1, 2, 3]), $first);
306
        self::assertEquals(new ArrayObject([1, 2, 3]), $second);
307
        self::assertNotSame($first, $second);
308
    }
309
310
    public function test_extend_existing_callable_service(): void
311
    {
312
        $container = new Container();
313
        $container->set('n3', 3);
314
        $container->set('service_name', static fn () => new ArrayObject([1, 2]));
315
316
        $container->extend(
317
            'service_name',
318
            static function (ArrayObject $arrayObject, Container $container) {
319
                $arrayObject->append($container->get('n3'));
320
                return $arrayObject;
321
            },
322
        );
323
324
        $container->extend(
325
            'service_name',
326
            static fn (ArrayObject $arrayObject) => $arrayObject->append(4),
327
        );
328
329
        /** @var ArrayObject $actual */
330
        $actual = $container->get('service_name');
331
332
        self::assertEquals(new ArrayObject([1, 2, 3, 4]), $actual);
333
    }
334
335
    public function test_set_after_extend(): void
336
    {
337
        $container = new Container();
338
339
        $container->extend(
340
            'service_name',
341
            static fn (ArrayObject $arrayObject) => $arrayObject->append(3),
342
        );
343
344
        $container->set('service_name', static fn () => new ArrayObject([1, 2]));
345
346
        /** @var ArrayObject $actual */
347
        $actual = $container->get('service_name');
348
349
        self::assertEquals(new ArrayObject([1, 2, 3]), $actual);
350
    }
351
352
    public function test_extend_existing_object_service(): void
353
    {
354
        $container = new Container();
355
        $container->set('n3', 3);
356
        $container->set('service_name', new ArrayObject([1, 2]));
357
358
        $container->extend(
359
            'service_name',
360
            static function (ArrayObject $arrayObject, Container $container) {
361
                $arrayObject->append($container->get('n3'));
362
                return $arrayObject;
363
            },
364
        );
365
366
        $container->extend(
367
            'service_name',
368
            static function (ArrayObject $arrayObject): void {
369
                $arrayObject->append(4);
370
            },
371
        );
372
373
        /** @var ArrayObject $actual */
374
        $actual = $container->get('service_name');
375
376
        self::assertEquals(new ArrayObject([1, 2, 3, 4]), $actual);
377
    }
378
379
    public function test_extend_existing_array_service(): void
380
    {
381
        $container = new Container();
382
        $container->set('service_name', [1, 2]);
383
384
        $container->extend(
385
            'service_name',
386
            static function (array $arrayObject): array {
387
                $arrayObject[] = 3;
388
                return $arrayObject;
389
            },
390
        );
391
392
        $container->extend(
393
            'service_name',
394
            static function (array &$arrayObject): void {
395
                $arrayObject[] = 4;
396
            },
397
        );
398
399
        /** @var ArrayObject $actual */
400
        $actual = $container->get('service_name');
401
402
        self::assertEquals([1, 2, 3, 4], $actual);
403
    }
404
405
    public function test_extend_non_existing_service(): void
406
    {
407
        $container = new Container();
408
        $container->extend('service_name', static fn () => '');
409
410
        self::assertNull($container->get('service_name'));
411
    }
412
413
    public function test_service_not_extendable(): void
414
    {
415
        $container = new Container();
416
        $container->set('service_name', 'raw string');
417
418
        $this->expectExceptionObject(ContainerException::instanceNotExtendable());
419
        $container->extend('service_name', static fn (string $str) => $str);
420
    }
421
422
    public function test_extend_existing_used_object_service_is_allowed(): void
423
    {
424
        $container = new Container();
425
        $container->set('service_name', new ArrayObject([1, 2]));
426
        $container->get('service_name'); // and get frozen
427
428
        $this->expectExceptionObject(ContainerException::frozenInstanceExtend('service_name'));
429
430
        $container->extend(
431
            'service_name',
432
            static fn (ArrayObject $arrayObject) => $arrayObject->append(3),
433
        );
434
    }
435
436
    public function test_extend_existing_used_callable_service_then_error(): void
437
    {
438
        $container = new Container();
439
        $container->set('service_name', static fn () => new ArrayObject([1, 2]));
440
        $container->get('service_name'); // and get frozen
441
442
        $this->expectExceptionObject(ContainerException::frozenInstanceExtend('service_name'));
443
444
        $container->extend(
445
            'service_name',
446
            static fn (ArrayObject $arrayObject) => $arrayObject->append(3),
447
        );
448
    }
449
450
    public function test_extend_later_existing_frozen_object_service_then_error(): void
451
    {
452
        $container = new Container();
453
        $container->extend(
454
            'service_name',
455
            static fn (ArrayObject $arrayObject) => $arrayObject->append(3),
456
        );
457
458
        $container->set('service_name', new ArrayObject([1, 2]));
459
        $container->get('service_name'); // and get frozen
460
461
        $this->expectExceptionObject(ContainerException::frozenInstanceExtend('service_name'));
462
463
        $container->extend(
464
            'service_name',
465
            static fn (ArrayObject $arrayObject) => $arrayObject->append(4),
466
        );
467
    }
468
469
    public function test_extend_later_existing_frozen_callable_service_then_error(): void
470
    {
471
        $container = new Container();
472
        $container->extend(
473
            'service_name',
474
            static fn (ArrayObject $arrayObject) => $arrayObject->append(3),
475
        );
476
477
        $container->set('service_name', static fn () => new ArrayObject([1, 2]));
478
        $container->get('service_name'); // and get frozen
479
480
        $this->expectExceptionObject(ContainerException::frozenInstanceExtend('service_name'));
481
482
        $container->extend(
483
            'service_name',
484
            static fn (ArrayObject $arrayObject) => $arrayObject->append(4),
485
        );
486
    }
487
488
    public function test_set_existing_frozen_service(): void
489
    {
490
        $container = new Container();
491
        $container->set('service_name', static fn () => new ArrayObject([1, 2]));
492
        $container->get('service_name'); // and get frozen
493
494
        $this->expectExceptionObject(ContainerException::frozenInstanceOverride('service_name'));
495
        $container->set('service_name', static fn () => new ArrayObject([3]));
496
    }
497
498
    public function test_protect_service_is_not_resolved(): void
499
    {
500
        $container = new Container();
501
        $service = static fn () => 'value';
502
        $container->set('service_name', $container->protect($service));
503
504
        self::assertSame($service, $container->get('service_name'));
505
    }
506
507
    public function test_protect_service_cannot_be_extended(): void
508
    {
509
        $container = new Container();
510
        $container->set(
511
            'service_name',
512
            $container->protect(static fn () => new ArrayObject([1, 2])),
513
        );
514
515
        $this->expectExceptionObject(ContainerException::instanceProtected('service_name'));
516
517
        $container->extend(
518
            'service_name',
519
            static fn (ArrayObject $arrayObject) => $arrayObject,
520
        );
521
    }
522
523
    public function test_circular_dependency_two_classes(): void
524
    {
525
        $this->expectException(CircularDependencyException::class);
526
        $this->expectExceptionMessage('Circular dependency detected: GacelaTest\Fake\CircularB -> GacelaTest\Fake\CircularA -> GacelaTest\Fake\CircularB');
527
528
        Container::create(CircularA::class);
529
    }
530
531
    public function test_circular_dependency_three_classes(): void
532
    {
533
        $this->expectException(CircularDependencyException::class);
534
        $this->expectExceptionMessage('Circular dependency detected: GacelaTest\Fake\CircularD -> GacelaTest\Fake\CircularE -> GacelaTest\Fake\CircularC -> GacelaTest\Fake\CircularD');
535
536
        Container::create(CircularC::class);
537
    }
538
539
    public function test_get_registered_services(): void
540
    {
541
        $container = new Container();
542
        self::assertSame([], $container->getRegisteredServices());
543
544
        $container->set('service1', 'value1');
545
        $container->set('service2', 'value2');
546
547
        self::assertSame(['service1', 'service2'], $container->getRegisteredServices());
548
    }
549
550
    public function test_is_factory(): void
551
    {
552
        $container = new Container();
553
        $factory = $container->factory(static fn () => new ArrayObject());
554
        $nonFactory = static fn () => new ArrayObject();
555
556
        $container->set('factory_service', $factory);
557
        $container->set('non_factory_service', $nonFactory);
558
559
        self::assertTrue($container->isFactory('factory_service'));
560
        self::assertFalse($container->isFactory('non_factory_service'));
561
        self::assertFalse($container->isFactory('non_existent'));
562
    }
563
564
    public function test_is_frozen(): void
565
    {
566
        $container = new Container();
567
        $container->set('service', 'value');
568
569
        self::assertFalse($container->isFrozen('service'));
570
571
        $container->get('service');
572
573
        self::assertTrue($container->isFrozen('service'));
574
    }
575
576
    public function test_get_bindings(): void
577
    {
578
        $bindings = [
579
            PersonInterface::class => Person::class,
580
            'some_service' => static fn () => 'value',
581
        ];
582
583
        $container = new Container($bindings);
584
585
        self::assertSame($bindings, $container->getBindings());
586
    }
587
588
    public function test_warm_up_caches_dependencies(): void
589
    {
590
        $container = new Container();
591
592
        // Warm up should pre-resolve dependencies
593
        $container->warmUp([
594
            ClassWithObjectDependencies::class,
595
            ClassWithRelationship::class,
596
            Person::class,
597
        ]);
598
599
        // After warm-up, instantiation should be faster (dependencies cached)
600
        $result = $container->get(ClassWithObjectDependencies::class);
601
602
        self::assertInstanceOf(ClassWithObjectDependencies::class, $result);
603
        self::assertInstanceOf(Person::class, $result->person);
604
    }
605
606
    public function test_warm_up_skips_non_existent_classes(): void
607
    {
608
        $container = new Container();
609
610
        // Should not throw exception for non-existent class
611
        $container->warmUp([
612
            'NonExistentClass',
613
            Person::class,
614
        ]);
615
616
        self::assertInstanceOf(Person::class, $container->get(Person::class));
617
    }
618
619
    public function test_interface_binding_with_constructor_dependencies(): void
620
    {
621
        // This test ensures that when an interface is bound to a concrete implementation
622
        // that has constructor dependencies, those dependencies are properly resolved
623
        $bindings = [
624
            RepositoryInterface::class => DatabaseRepository::class,
625
        ];
626
627
        $container = new Container($bindings);
628
        $service = $container->get(ServiceWithRepository::class);
629
630
        self::assertInstanceOf(ServiceWithRepository::class, $service);
631
        self::assertInstanceOf(DatabaseRepository::class, $service->repository);
632
        self::assertInstanceOf(Person::class, $service->repository->person);
633
        self::assertInstanceOf(ClassWithoutDependencies::class, $service->repository->config);
634
    }
635
}
636