Middle
Mi a mock és a stub? Miben különböznek?
sobes.tech MI
Válasz az MI-től
Mockok és stubok olyan tesztelési másolat típusok, amelyeket egységtesztekben használnak az objektumok valódi függőségeinek viselkedésének szimulálására.
Stub:
- Egy "állandó" viselkedést nyújt egy tesztesethez.
- Válaszokat ad a metódushívásokra, előre meghatározott értékeket visszaadva.
- Nem ellenőrzi az interakciót, célja, hogy adatokat szolgáltasson, hogy a tesztelt objektum folytathassa.
<?php
// Stub objektum példa
class StubDatabase {
public function getUserById(int $id): ?array {
// Szimulálja a visszatérési értéket egy adott ID esetén
if ($id === 1) {
return ['id' => 1, 'name' => 'Test User'];
}
return null;
}
}
Mock:
- Hasonló a stubhoz, de az interakció ellenőrzésének logikájával.
- Várakozásokat tartalmaz arra vonatkozóan, hogy mely metódusokat kell meghívni, hányszor és milyen argumentumokkal.
- A teszt nemcsak az eredményt, hanem a mock-kal való helyes interakciót is ellenőrzi.
<?php
// Mock objektum példa
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\MockObject\MockObject;
class UserServiceTest extends TestCase {
public function testGetUserByIdCallsDatabase(): void {
$databaseMock = $this->createMock(Database::class);
$databaseMock->expects($this->once()) // Egy hívást várunk
->method('getUserById')
->with(1) // Várt argumentum
->willReturn(['id' => 1, 'name' => 'Test User']); // Várt visszatérési érték
$userService = new UserService($databaseMock);
$user = $userService->getUserById(1);
// Eredmény és interakció ellenőrzése
$this->assertNotEmpty($user);
$this->assertEquals('Test User', $user['name']);
}
}
Összehasonlító táblázat:
| Jellemző | Stub | Mock |
|---|---|---|
| Cél | Adatok biztosítása a teszthez | Interakció és adatok ellenőrzése |
| Ellenőrzés | Nem ellenőrzi az interakciót | Ellenőrzi, hogyan működik az objektum vele |
| Viselkedés logika | Csak értékeket ad vissza | Várakozásokat tartalmaz az hívásokról |
Ki végzi az assert-et? |
A tesztelt objektum vagy kliens | A mock (várakozásokon keresztül) |