[JAVA] Vérifiez avec Mockito si la méthode a été appelée lorsque Carte → Liste (quand, vérifier)

Vous pouvez vérifier si la méthode Stub est appelée avec un argument fixe en utilisant la vérification de Mockito, mais lors de l'utilisation de Map, elle sera aléatoire et ne fonctionnera donc pas avec la vérification normale. Validez les arguments en utilisant argThat de ArgumentMatcher.

Maven Ajoutez une dépendance à pom.xml afin que vous puissiez utiliser ArgumentMatcher's argThat.

Par exemple ... </ u> </ font>

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

@Service
@RequiredArgsConstructor //Dépôt de Dieu à câblage automatique sans utiliser de constructeur
public class GodServiceImpl implements GodService {

  private final GodRepository godRepository; //Final lors de l'utilisation de RequiredArgsConstructor

  @Override
  public void update(Map map) {
    List<String> updateList = new ArrayList<>(map.keySet()); //Liste dans un ordre aléatoire
    godRepository.update(updateList);
  }
}

Créer un test de

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) //Omettez les paramètres nécessaires, etc.
class GodServiceImplTest {

  private GodService godService;

  @Mock
  private GodRepository godRepository;

  @BeforeEach
  public void setUp() {
    godService = new GodServiceImpl(godRepository); //Injecter le référentiel de Dieu moqueur
  }

  @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"));
  }
}

Lorsque vous exécutez le test

org.mockito.exceptions.misusing.PotentialStubbingProblem: 
Strict stubbing argument mismatch. Please check:
 - this invocation of 'update' method:
    godRepository.update([4d, 1c, 2a, 3b]);

On dit que l'ordre des arguments est différent.

ArgumentMatcher Par conséquent, l'argument est également vérifié à l'aide de argThat de ArgumentMatcher.

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) //Omettez les paramètres nécessaires, etc.
class GodServiceImplTest {

  private GodService godService;

  @Mock
  private GodRepository godRepository;

  @BeforeEach
  public void setUp() {
    godService = new GodServiceImpl(godRepository); //Injecter le référentiel de Dieu moqueur
  }

  @Test
  void update() {
    //Si seulement contientAll, même 3 arguments passeront, alors évitez-le avec la taille
    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