94 votes

Se moquer de Java InputStream

Veuillez fournir des pointeurs pour m'aider à simuler cet objet java InputStream. C'est la ligne de code que je voudrais moquer:

 InputStreamReader inputData = new InputStreamReader(System.in);
bufferdReader = new BufferedReader(inputData);
bufferdReader.readLine(); 

130voto

Eric Points 630

Vous pouvez utiliser commons-io pour créer des flux d'entrée de stub :

 InputStream stubInputStream = 
     IOUtils.toInputStream("some test data for my input stream", "UTF-8");

126voto

pap Points 11466

Vous pouvez simplement utiliser un ByteArrayInputStream et le remplir avec vos données de test.

Exemple de @Brad dans les commentaires :

 InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes());

65voto

Boris Pavlović Points 22207
BufferedReader bufferedReader = org.mockito.Mockito.mock(BufferedReader.class);
when(bufferedReader.readLine())
  .thenReturn("first line")
  .thenReturn("second line");

org.junit.Assert.when(new Client(bufferedReader).parseLine())
  .thenEquals(IsEqual.equalTo("first line"));

21voto

John Deverall Points 103

Je ne suis pas d'accord avec la réponse choisie pour cette question. Les frameworks moqueurs comme Mockito sont sympas et tous, mais lorsque l'API Java standard est disponible, vous pouvez envisager de l'utiliser à la place.

c'est à dire

 BufferedReader reader = new BufferedReader(new StringReader("some string"));

Pourquoi utiliser un objet Mock dans vos classes de test alors que vous pourriez en utiliser un réel avec tout son état et son comportement ?

Pour en savoir plus sur la façon dont cela fonctionne, vous pouvez rechercher le modèle de conception « décorateur ».

3voto

Nathan Hughes Points 30377

Modifiez votre objet pour qu'il soit plus facile à tester, quelque chose comme ceci :

 public MyObject {
    private InputStream inputStream;

    public void setInputStream(InputStream inputStream) {this.inputStream = inputStream;}

    public void whatever() {
        InputStreamReader inputData = new InputStreamReader(inputStream);
        bufferdReader = new BufferedReader(inputData);
        bufferdReader.readLine(); 
    }
}

puis, lorsque vous utilisez votre objet, initialisez d'abord son inputStream :

 MyObject myObject = new MyObject();
myObject.setInputStream(System.in);

Vous avez maintenant un objet où vous pouvez le tester en utilisant n'importe quelle implémentation de InputStream que vous voulez (ByteArrayInputStream est un bon à essayer).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X