Sobes.tech
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)