Middle
Τι είναι τα mocks και τα stubs; Πώς διαφέρουν;
sobes.tech AI
Απάντηση από AI
Mocks και stubs είναι τύποι δοκιμαστικών διπλότυπων που χρησιμοποιούνται στις μονάδες δοκιμών για την προσομοίωση της συμπεριφοράς των πραγματικών εξαρτήσεων του αντικειμένου.
Stub:
- Παρέχει μια "σταθερή" συμπεριφορά για ένα σενάριο δοκιμής.
- Απαντά σε κλήσεις μεθόδων επιστρέφοντας προκαθορισμένες τιμές.
- Δεν ελέγχει την αλληλεπίδραση, ο στόχος του είναι να παρέχει δεδομένα ώστε το δοκιμαζόμενο αντικείμενο να συνεχίσει.
<?php
// Παράδειγμα αντικειμένου stub
class StubDatabase {
public function getUserById(int $id): ?array {
// Προσομοίωση της επιστρεφόμενης τιμής για συγκεκριμένο ID
if ($id === 1) {
return ['id' => 1, 'name' => 'Test User'];
}
return null;
}
}
Mock:
- Παρόμοιο με το stub, αλλά με λογική ελέγχου της αλληλεπίδρασης.
- Περιέχει προσδοκίες σχετικά με το ποια methods πρέπει να καλούνται, πόσες φορές και με ποια επιχειρήματα.
- Η δοκιμή ελέγχει όχι μόνο το αποτέλεσμα, αλλά και τη σωστή αλληλεπίδραση με το mock.
<?php
// Παράδειγμα mock αντικειμένου
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()) // Αναμένουμε μία κλήση
->method('getUserById')
->with(1) // Αναμένουμε το όρισμα 1
->willReturn(['id' => 1, 'name' => 'Test User']); // Αναμενόμενη επιστρεφόμενη τιμή
$userService = new UserService($databaseMock);
$user = $userService->getUserById(1);
// Έλεγχος αποτελέσματος και αλληλεπίδρασης
$this->assertNotEmpty($user);
$this->assertEquals('Test User', $user['name']);
}
}
Πίνακας σύγκρισης:
| Χαρακτηριστικό | Stub | Mock |
|---|---|---|
| Σκοπός | Παροχή δεδομένων για δοκιμή | Έλεγχος αλληλεπίδρασης και δεδομένων |
| Έλεγχος | Δεν ελέγχει την αλληλεπίδραση | Ελέγχει πώς λειτουργεί το αντικείμενο με αυτό |
| Λογική συμπεριφοράς | Απλώς επιστρέφει τιμές | Περιέχει προσδοκίες κλήσεων |
Ποιος κάνει assert |
Το δοκιμαζόμενο αντικείμενο ή ο πελάτης | Ο ίδιος ο mock (μέσω προσδοκιών) |