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.