Mockito.mock () vs @Mock vs @MockBean

1. Übersicht

In diesem kurzen Tutorial werden drei verschiedene Möglichkeiten zum Erstellen von Scheinobjekten und deren Unterschiede untersucht - mit Mockito und mit der Spring-Verspottungsunterstützung.

2. Mockito.mock ()

Mit der Methode Mockito.mock () können wir ein Scheinobjekt einer Klasse oder einer Schnittstelle erstellen.

Dann können wir den Mock verwenden, um Rückgabewerte für seine Methoden zu stubben und zu überprüfen, ob sie aufgerufen wurden.

Schauen wir uns ein Beispiel an:

@Test public void givenCountMethodMocked_WhenCountInvoked_ThenMockedValueReturned() { UserRepository localMockRepository = Mockito.mock(UserRepository.class); Mockito.when(localMockRepository.count()).thenReturn(111L); long userCount = localMockRepository.count(); Assert.assertEquals(111L, userCount); Mockito.verify(localMockRepository).count(); }

Diese Methode muss nicht weiter ausgeführt werden, bevor sie verwendet werden kann. Wir können es verwenden, um Scheinklassenfelder sowie lokale Verspottungen in einer Methode zu erstellen.

3. Mockitos @ Mock- Anmerkung

Diese Annotation ist eine Abkürzung für die Mockito.mock () -Methode. Außerdem sollten wir es nur in einer Testklasse verwenden. Im Gegensatz zur mock () -Methode müssen wir Mockito-Annotationen aktivieren, um diese Annotation verwenden zu können.

Wir können dies entweder tun, indem wir den Test mit dem MockitoJUnitRunner ausführen oder die Methode MockitoAnnotations.initMocks () explizit aufrufen .

Schauen wir uns ein Beispiel mit MockitoJUnitRunner an :

@RunWith(MockitoJUnitRunner.class) public class MockAnnotationUnitTest { @Mock UserRepository mockRepository; @Test public void givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned() { Mockito.when(mockRepository.count()).thenReturn(123L); long userCount = mockRepository.count(); Assert.assertEquals(123L, userCount); Mockito.verify(mockRepository).count(); } }

@Mock macht den Code nicht nur besser lesbar, sondern erleichtert auch das Auffinden des Problemmodells im Fehlerfall , da der Name des Felds in der Fehlermeldung angezeigt wird:

Wanted but not invoked: mockRepository.count(); -> at org.baeldung.MockAnnotationTest.testMockAnnotation(MockAnnotationTest.java:22) Actually, there were zero interactions with this mock. at org.baeldung.MockAnnotationTest.testMockAnnotation(MockAnnotationTest.java:22) 

In Verbindung mit @InjectMocks kann die Menge an Setup-Code erheblich reduziert werden.

4. Die @ MockBean- Anmerkung von Spring Boot

Wir können die @MockBean verwenden , um dem Spring-Anwendungskontext Scheinobjekte hinzuzufügen. Der Mock ersetzt alle vorhandenen Beans desselben Typs im Anwendungskontext.

Wenn keine Bean des gleichen Typs definiert ist, wird eine neue hinzugefügt. Diese Anmerkung ist nützlich bei Integrationstests, bei denen eine bestimmte Bean - beispielsweise ein externer Dienst - verspottet werden muss.

Um diese Anmerkung zu verwenden, müssen wir SpringRunner verwenden , um den Test auszuführen:

@RunWith(SpringRunner.class) public class MockBeanAnnotationIntegrationTest { @MockBean UserRepository mockRepository; @Autowired ApplicationContext context; @Test public void givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned() { Mockito.when(mockRepository.count()).thenReturn(123L); UserRepository userRepoFromContext = context.getBean(UserRepository.class); long userCount = userRepoFromContext.count(); Assert.assertEquals(123L, userCount); Mockito.verify(mockRepository).count(); } }

Wenn wir die Annotation für ein Feld verwenden und im Anwendungskontext registriert sind, wird der Mock auch in das Feld eingefügt.

Dies ist im obigen Code ersichtlich. Hier haben wir die injizierten verwendet UserRepository mock Stub die Zählung Methode . Wir haben dann die Bean aus dem Anwendungskontext verwendet, um zu überprüfen, ob es sich tatsächlich um die verspottete Bean handelt.

5. Schlussfolgerung

In diesem Artikel haben wir gesehen, wie sich die drei Methoden zum Erstellen von Scheinobjekten unterscheiden und wie sie jeweils verwendet werden können.

Der diesem Artikel beiliegende Quellcode ist auf GitHub verfügbar.