6
votes

Mock une méthode qui renvoie un Stream et est appelée plus d'une fois

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

1 commentaires

Veuillez ne pas faire "" + , utilisez toString ()


4 Réponses :


11
votes

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.


1 commentaires

Answer est une interface fonctionnelle, vous pouvez la renvoyer via lambda (qui est beaucoup plus lisible la plupart du temps).



0
votes

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);


0 commentaires

6
votes

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.


0 commentaires

1
votes

Essayez alorsRéponse en utilisant l'approche Java 8

when(mock.streamMethod()).thenAnswer(invocation -> Stream.of("A", "B"))


0 commentaires