[JAVA] Autowired-Klassen verspotten und testen (MockitoExtension, initMocks)

Zum Zeitpunkt von UT (Unit Test) können Sie mit @Mock eine Autowired-Klasse verspotten und ihr Verhalten frei bestimmen. Mit @Mock können Sie sich unabhängig von der Außenwelt auf die Klassen konzentrieren, die Sie testen möchten. Sie müssen Mockito Extension oder initMocks verwenden, da Sie bei Verwendung von @Mock einen Zauber benötigen.

Maven Fügen Sie pom.xml eine Abhängigkeit hinzu, um [MockitoExtension] zu verwenden (https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api).

initMocks

import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor //Autowired God Repository ohne Verwendung eines Konstruktors
public class GodServiceImpl implements GodService {

  private final GodRepository godRepository; //Endgültig bei Verwendung von RequiredArgsConstructor

  @Override
  public void update(List updateList) {
    godRepository.update(updateList);
  }
}

Bei Verwendung von initMocks im Test von

import static java.util.Arrays.asList;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;

import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;

class GodServiceImplTest {

  @InjectMocks //Klassen, die die Mocked-Klasse verwenden
  private GodServiceImpl godServiceImpl;

  @Mock //Klasse, die du verspotten willst
  private GodRepository godRepository;

  @BeforeEach
  public void setUp() {
    initMocks(this); //Magie
  }

  @Test
  void update() {
    List<String> updateList = asList("a", "b", "c", "d");
    when(godRepository.update(updateList)).thenReturn(4);

    godServiceImpl.update(updateList);

    verify(godRepository).update(updateList);
  }
}

Es scheint, dass initMocks das Mock-Objekt initialisiert ...

MockitoExtension Mit Mockito-Erweiterung

import static java.util.Arrays.asList;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class) //Magie
class GodServiceImplTest {

  private GodService godService;

  @Mock //Klasse, die du verspotten willst
  private GodRepository godRepository;

  @BeforeEach
  public void setUp() {
    godService = new GodServiceImpl(godRepository); //Injizieren Sie das Mocked God Repository
  }

  @Test
  void update() {
    List<String> updateList = asList("a", "b", "c", "d");
    when(godRepository.update(updateList)).thenReturn(4);

    godService.update(updateList);

    verify(godRepository).update(updateList);
  }
}

Nur durch Verspotten können Sie nicht sagen, welche Klasse Sie verspotten möchten, daher müssen Sie sie als Argument übergeben.

MockitoExtension + InjectMocks Sie können auch Mockito Extension und Inject Mocks kombinieren.

import static java.util.Arrays.asList;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.util.List;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class) //Magie
class GodServiceImplTest {

  @InjectMocks //Klassen, die die Mocked-Klasse verwenden
  private GodServiceImpl godServiceImpl;

  @Mock //Klasse, die du verspotten willst
  private GodRepository godRepository;

  @Test
  void update() {
    List<String> updateList = asList("a", "b", "c", "d");
    when(godRepository.update(updateList)).thenReturn(4);

    godServiceImpl.update(updateList);

    verify(godRepository).update(updateList);
  }
}

Sie müssen Mock-Objekte nicht mehr mit Before Each injizieren.

Recommended Posts

Autowired-Klassen verspotten und testen (MockitoExtension, initMocks)
[Ruby] Klassen und Instanzen
HashMap- und HashSet-Klassen
Über Klassen und Instanzen
Mock Test de Mockito
Ruby-Klassen und -Instanzen
Liste und fröhliche Klassen
Java (Klasse und Instanz)