MyStreamClass mock = mock(MyStreamClass.class); when(mock.streamMethod()).thenReturn(Stream.of("A", "B")); System.out.println(""+mock.streamMethod().findFirst()); System.out.println(""+mock.streamMethod().findFirst()); the second call of findFirst will throw java.lang.IllegalStateException: stream has already been operated upon or closed
4 Réponses :
Essayez thenAnswer
au lieu de thenReturn
:
Answer<Stream> answer = new Answer<Stream>() { public Stream answer(InvocationOnMock invocation) throws Throwable { return Stream.of("A", "B"); } }; when(mock.streamMethod()).thenAnswer(answer);
Maintenant, un nouveau Stream sera créé pour chaque appel à streamMethod
.
Pour en savoir plus:
Voici un article que j'ai écrit sur Réponse dynamique dans Mockito qui pourrait être complémentaire.
Answer
est une interface fonctionnelle, vous pouvez la renvoyer via lambda (qui est beaucoup plus lisible la plupart du temps).
Essayez ceci:
MyStreamClass mock = Mockito.mock(MyStreamClass.class); Mockito.when(mock.streamMethod()).thenReturn(Stream.of("A", "B")); Stream s = mock.streamMethod(); s.forEach(System.out::println);
Vous ne vous moquez pas d'un Stream, vous en créez un - et un seul, qui sera consommé après l'appel de la première méthode de terminaison, ce que vous ressentez.
La plupart du temps, il est préférable de s'en tenir à la moquerie autant que possible, dans votre cas
when(mock.streamMethod()).thenReturn(Stream.of("A", "B"), Stream.of("A", "B"));
Cela devrait être suffisant pour tester tous les clients de MyStreamClass
- ça ne sert à rien pour obtenir les résultats réels du flux.
Si cela ne correspond pas à votre conception, vous pouvez également utiliser un Answer
:
when(mock.streamMethod()).then(i -> Stream.of("A", "B"));
cela entraînera la création du flux à chaque fois que la méthode est appelée.
Ou, vous pouvez vous moquer de plusieurs appels avec thenReturn()
.
MyStreamClass mock = mock(MyStreamClass.class); Stream mockStream = mock(Stream.class); when(mock.streamMethod()).thenReturn(mockStream);
qui durera 2 appels.
Essayez alorsRéponse en utilisant l'approche Java 8
when(mock.streamMethod()).thenAnswer(invocation -> Stream.of("A", "B"))
Veuillez ne pas faire
"" +
, utiliseztoString ()