Sie können überprüfen, ob die Stub-Methode mit einem festen Argument aufgerufen wird, indem Sie Mockitos Verifizierung verwenden. Bei Verwendung von Map ist sie jedoch zufällig, sodass sie bei normaler Verifizierung nicht funktioniert. Überprüfen Sie die Argumente mit argThat von ArgumentMatcher.
Maven Fügen Sie pom.xml eine Abhängigkeit hinzu, damit Sie [ArgumentMatchers argThat] verwenden können (https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter).
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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(Map map) {
List<String> updateList = new ArrayList<>(map.keySet()); //Liste in zufälliger Reihenfolge
godRepository.update(updateList);
}
}
Erstellen Sie einen Test von
import static java.util.Arrays.asList;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import java.util.Map;
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) //Lassen Sie die erforderlichen Einstellungen usw. weg.
class GodServiceImplTest {
private GodService godService;
@Mock
private GodRepository godRepository;
@BeforeEach
public void setUp() {
godService = new GodServiceImpl(godRepository); //Injizieren Sie das Mocked God Repository
}
@Test
void update() {
when(godRepository.update(asList("2a", "3b", "1c", "4d"))).thenReturn(4);
Map<String, String> updateMap = new HashMap<>();
updateMap.put("2a", "1");
updateMap.put("3b", "2");
updateMap.put("1c", "3");
updateMap.put("4d", "4");
godService.update(updateMap);
verify(godRepository).update(asList("2a", "3b", "1c", "4d"));
}
}
Wenn Sie den Test ausführen
org.mockito.exceptions.misusing.PotentialStubbingProblem:
Strict stubbing argument mismatch. Please check:
- this invocation of 'update' method:
godRepository.update([4d, 1c, 2a, 3b]);
Es wird gesagt, dass die Reihenfolge der Argumente unterschiedlich ist.
ArgumentMatcher Daher wird das Argument auch mit argThat von ArgumentMatcher überprüft.
import static java.util.Arrays.asList;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import java.util.Map;
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) //Lassen Sie die erforderlichen Einstellungen usw. weg.
class GodServiceImplTest {
private GodService godService;
@Mock
private GodRepository godRepository;
@BeforeEach
public void setUp() {
godService = new GodServiceImpl(godRepository); //Injizieren Sie das Mocked God Repository
}
@Test
void update() {
//Wenn nurAll enthält, werden sogar 3 Argumente übergeben. Vermeiden Sie es daher mit der Größe
when(godRepository.update(argThat(list -> list.size() == 4 &&
list.containsAll(asList("2a", "3b", "1c", "4d"))))).thenReturn(4);
Map<String, String> updateMap = new HashMap<>();
updateMap.put("2a", "1");
updateMap.put("3b", "2");
updateMap.put("1c", "3");
updateMap.put("4d", "4");
godService.update(updateMap);
verify(godRepository).update(argThat(list -> list.size() == 4 &&
list.containsAll(asList("2a", "3b", "1c", "4d"))));
}
}
Recommended Posts