tanszek:oktatas:mockito
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tanszek:oktatas:mockito [2026/10/01 12:23] – superuser | tanszek:oktatas:mockito [2026/10/01 12:54] (current) – superuser | ||
|---|---|---|---|
| Line 57: | Line 57: | ||
| A fontos rész az, hogy a BankService nem hozza létre saját maga a NotificationService-t, | A fontos rész az, hogy a BankService nem hozza létre saját maga a NotificationService-t, | ||
| Ez a dependency injection egyszerű formája. | Ez a dependency injection egyszerű formája. | ||
| + | |||
| + | === 4. Most jön a mock teszt. Hozd létre: === | ||
| + | src/ | ||
| + | |||
| + | Első változat: | ||
| + | < | ||
| + | package com.example; | ||
| + | |||
| + | import org.junit.jupiter.api.Test; | ||
| + | |||
| + | import static org.mockito.Mockito.mock; | ||
| + | import static org.mockito.Mockito.verify; | ||
| + | |||
| + | class BankServiceTest { | ||
| + | |||
| + | @Test | ||
| + | void depositSendsNotification() { | ||
| + | |||
| + | NotificationService notificationService = | ||
| + | mock(NotificationService.class); | ||
| + | |||
| + | BankService bankService = | ||
| + | new BankService(notificationService); | ||
| + | |||
| + | BankAccount account = | ||
| + | new BankAccount(); | ||
| + | |||
| + | bankService.deposit(account, | ||
| + | |||
| + | verify(notificationService) | ||
| + | .send(" | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | Ez már egy teljes Mockito teszt. | ||
| + | A kulcssor: | ||
| + | < | ||
| + | mock(NotificationService.class) | ||
| + | </ | ||
| + | Ez létrehoz egy ál-NotificationService objektumot. | ||
| + | Nem küld semmit sehova. | ||
| + | Csak " | ||
| + | A másik fontos rész: | ||
| + | < | ||
| + | verify(notificationService) | ||
| + | .send(" | ||
| + | </ | ||
| + | Ez azt ellenőrzi, hogy a mock objektum send() metódusát valóban meghívták. | ||
| + | |||
| + | 5. Futtasd: | ||
| + | < | ||
| + | mvn test | ||
| + | </ | ||
| + | Ha jó, akkor a BankServiceTest is zöld lesz. | ||
| + | {{ : | ||
| + | |||
| + | 6. Most ellenőrizzük a számlaegyenleget is: | ||
| + | < | ||
| + | package com.example; | ||
| + | |||
| + | import org.junit.jupiter.api.Test; | ||
| + | |||
| + | import static org.junit.jupiter.api.Assertions.assertEquals; | ||
| + | import static org.mockito.Mockito.mock; | ||
| + | import static org.mockito.Mockito.verify; | ||
| + | |||
| + | class BankServiceTest { | ||
| + | |||
| + | @Test | ||
| + | void depositSendsNotification() { | ||
| + | |||
| + | NotificationService notificationService = | ||
| + | mock(NotificationService.class); | ||
| + | |||
| + | BankService bankService = | ||
| + | new BankService(notificationService); | ||
| + | |||
| + | BankAccount account = | ||
| + | new BankAccount(); | ||
| + | |||
| + | bankService.deposit(account, | ||
| + | |||
| + | assertEquals( | ||
| + | 1000.0, | ||
| + | account.getBalance() | ||
| + | ); | ||
| + | |||
| + | verify(notificationService) | ||
| + | .send(" | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | Itt már két dolgot tesztelünk: | ||
| + | BankAccount állapota | ||
| + | + | ||
| + | NotificationService meghívása | ||
| + | |||
| + | === 7. Nézzük meg, mit jelent a mockolás gondolatilag. === | ||
| + | Normál programban: | ||
| + | BankService -» NotificationService -» valódi email / SMS / API | ||
| + | |||
| + | Tesztben: | ||
| + | BankService -» MOCK NotificationService | ||
| + | |||
| + | Így a teszt gyors, izolált, és nem használ külső rendszert. | ||
| + | |||
| + | === 8. A következő fontos Mockito fogalom a when(...).thenReturn(...) === | ||
| + | Ehhez csináljunk egy új interfészt: | ||
| + | src/ | ||
| + | < | ||
| + | package com.example; | ||
| + | |||
| + | public interface ExchangeRateService { | ||
| + | |||
| + | double getRate(String from, String to); | ||
| + | } | ||
| + | </ | ||
| + | Most a ExchangeRateServiceTest.java tesztfájlban: | ||
| + | < | ||
| + | ExchangeRateService rateService = | ||
| + | mock(ExchangeRateService.class); | ||
| + | |||
| + | when( | ||
| + | rateService.getRate(" | ||
| + | ).thenReturn(400.0); | ||
| + | </ | ||
| + | Ez azt jelenti: | ||
| + | ha valaki ezt hívja: | ||
| + | < | ||
| + | getRate(" | ||
| + | </ | ||
| + | akkor a mock válasza legyen: | ||
| + | |||
| + | 400.0 | ||
| + | |||
| + | Ehhez kell az import: | ||
| + | < | ||
| + | import static org.mockito.Mockito.when; | ||
| + | </ | ||
| + | |||
| + | === 9. A három legfontosabb Mockito elem tehát: === | ||
| + | < | ||
| + | mock(...) | ||
| + | </ | ||
| + | ál objektum létrehozása. | ||
| + | < | ||
| + | when(...).thenReturn(...) | ||
| + | </ | ||
| + | megmondjuk, mit válaszoljon. | ||
| + | < | ||
| + | verify(...) | ||
| + | </ | ||
| + | ellenőrizzük, | ||
| + | |||
| + | === 10. Következő lépésként érdemes ezt a példát továbbvinni @Mock és @InjectMocks használatával, | ||
| + | < | ||
| + | @Mock | ||
| + | private NotificationService notificationService; | ||
| + | |||
| + | @InjectMocks | ||
| + | private BankService bankService; | ||
| + | </ | ||
| + | Ez tisztább, mint minden tesztben kézzel meghívni a mock()-ot. | ||
tanszek/oktatas/mockito.1790857418.txt.gz · Last modified: by superuser
