Mockito.mock () vs @Mock vs @MockBean

Mockito.mock() vs @Mock vs @MockBean

1. Überblick

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.

Weitere Lektüre:

Mockito ArgumentMatchers

Erfahren Sie, wie Sie den ArgumentMatcher verwenden und wie er sich vom ArgumentCaptor unterscheidet.

Read more

Verspottende Ausnahme Werfen mit Mockito

Erfahren Sie, wie Sie einen Methodenaufruf zum Auslösen einer Ausnahme in Mockito konfigurieren.

Read more

2. Mockito.mock()

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

Anschließend können wir den Mock verwenden, um die Rückgabewerte für seine Methoden zu stubgen 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 in einer Methode Scheinklassenfelder sowie lokale Schein zu erstellen.

3. Mockitos@Mock Annotation

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

Wir können dies entweder tun, indem wirMockitoJUnitRunner verwenden, um den Test auszuführen, oder indem wir die MethodeMockitoAnnotations.initMocks() explizit aufrufen.

Schauen wir uns ein Beispiel mitMockitoJUnitRunner 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();
    }
}

Abgesehen davon, dass der Code besser lesbar ist, sind@Mock makes it easier to find the problem mock in case of a failure, as the name of the field appears in the failure message:

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

  at org.example.MockAnnotationTest.testMockAnnotation(MockAnnotationTest.java:22)

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

4. @MockBean Annotation von Spring Boot

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

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

Um diese Annotation zu verwenden, müssen wirSpringRunner 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 in einem Feld verwenden und im Anwendungskontext registriert sind, wird der Schein ebenfalls in das Feld eingefügt.

Dies geht aus dem obigen Code hervor. Hier haben wir den injiziertenUserRepository -Kittel verwendet, um diecount -Smethod zu stoppen. Wir haben dann die Bean aus dem Anwendungskontext verwendet, um zu überprüfen, ob es sich tatsächlich um die verspottete Bean handelt.

5. Fazit

In diesem Artikel haben wir gesehen, wie sich die drei Methoden zum Erstellen von Scheinobjekten unterscheiden und wie jedes verwendet werden kann.

Der diesem Artikel beiliegende Quellcode istover on GitHub.