Je veux me moquer de l'extrait de code suivant en utilisant Mockito.

Future<Optional<List<User>>> getUser =
       executorService.submit(() -> userRepository.findById(user.getUserId()));

J'ai essayé avec le code suivant, mais cela n'a pas fonctionné

    @Mock
    private ExecutorService executorService;

    @Mock
    private userRepository userRepository;

    when(executorService.submit(() -> userRepository.findById(USER_ID)))
           .thenReturn(ConcurrentUtils.constantFuture(userList));

Quelqu'un peut-il me donner une solution pour cela?

1
slkhan 21 oct. 2020 à 17:45

2 réponses

Meilleure réponse

Merci pour vos réponses. J'ai trouvé une solution pour ce scénario.

Nous pouvons simuler un appel de service exécuteur en utilisant l'extrait de code suivant.

when(executorService.submit(any(Callable.class)))
      .thenReturn(ConcurrentUtils.constantFuture(userList()));

Et si vous avez plus d'un appels ExecutorService dans votre appel de méthode, vous pouvez vous moquer de chaque réponse en les ajoutant sous forme de liste séparée par des virgules à l'appel Mockito comme suit.

when(executorService.submit(any(Callable.class)))
      .thenReturn(ConcurrentUtils.constantFuture(userList()),
           ConcurrentUtils.constantFuture(Optional.of(departmentList())));
0
slkhan 24 oct. 2020 à 17:05

Vous ne voulez pas jouer avec le ExecutorService lui-même mais plutôt vous moquer de findById pour obtenir le résultat. Tant que le simulacre renvoie le résultat immédiatement (à moins que vous ne le laissiez Thread.sleep pendant un moment), l'appel lui-même dans le ExecutorService est rapide et le résultat est donc enveloppé dans le Future.

Mockito.when(userRepository.findById(Mockito.any()).thenReturn(userList);

Alors vous n'avez pas du tout besoin de vous moquer du ExecutorService, vous voulez utiliser un vrai service, ou bien il ne fait pas ce qu'il est censé faire.

1
Nikolas Charalambidis 21 oct. 2020 à 15:10