Junit Test for InputStreamReader with Mockito












3














Can you please help me in writing the Junit test case for the below code?



public class ConsoleReader implements InputReader {
public Cell readInput() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = reader.readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
}









share|improve this question




















  • 1




    Insteed of new InputStreamReader(System.in) pass System.in as method argument so you will be able to actually push data into the stream.
    – Antoniossss
    Nov 20 at 12:10










  • Possible duplicate of Mocking Java InputStream
    – Renny
    Nov 20 at 13:01






  • 1




    as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
    – hunter
    Nov 20 at 13:57
















3














Can you please help me in writing the Junit test case for the below code?



public class ConsoleReader implements InputReader {
public Cell readInput() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = reader.readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
}









share|improve this question




















  • 1




    Insteed of new InputStreamReader(System.in) pass System.in as method argument so you will be able to actually push data into the stream.
    – Antoniossss
    Nov 20 at 12:10










  • Possible duplicate of Mocking Java InputStream
    – Renny
    Nov 20 at 13:01






  • 1




    as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
    – hunter
    Nov 20 at 13:57














3












3








3







Can you please help me in writing the Junit test case for the below code?



public class ConsoleReader implements InputReader {
public Cell readInput() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = reader.readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
}









share|improve this question















Can you please help me in writing the Junit test case for the below code?



public class ConsoleReader implements InputReader {
public Cell readInput() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter the co-ordinate Seperated by Comma");
String coOrdinates = reader.readLine();
String values=coOrdinates.split("\,");
return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
} catch (IOException ioe) {
ioe.printStackTrace();
}
return null;
}
}






java junit mockito






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 20 at 12:08

























asked Nov 20 at 12:02









Sunny

16513




16513








  • 1




    Insteed of new InputStreamReader(System.in) pass System.in as method argument so you will be able to actually push data into the stream.
    – Antoniossss
    Nov 20 at 12:10










  • Possible duplicate of Mocking Java InputStream
    – Renny
    Nov 20 at 13:01






  • 1




    as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
    – hunter
    Nov 20 at 13:57














  • 1




    Insteed of new InputStreamReader(System.in) pass System.in as method argument so you will be able to actually push data into the stream.
    – Antoniossss
    Nov 20 at 12:10










  • Possible duplicate of Mocking Java InputStream
    – Renny
    Nov 20 at 13:01






  • 1




    as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
    – hunter
    Nov 20 at 13:57








1




1




Insteed of new InputStreamReader(System.in) pass System.in as method argument so you will be able to actually push data into the stream.
– Antoniossss
Nov 20 at 12:10




Insteed of new InputStreamReader(System.in) pass System.in as method argument so you will be able to actually push data into the stream.
– Antoniossss
Nov 20 at 12:10












Possible duplicate of Mocking Java InputStream
– Renny
Nov 20 at 13:01




Possible duplicate of Mocking Java InputStream
– Renny
Nov 20 at 13:01




1




1




as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
– hunter
Nov 20 at 13:57




as Antoniossss has suggested the best solution (even from design perspective). if you dont like that solution , there is a tricky/dirty solution. use the System.setIn and set a mock inputstream , once your test case is executed restore the system.in using the same method. this will work only in environment you dont have securitymanger or you have permission to setIO
– hunter
Nov 20 at 13:57












2 Answers
2






active

oldest

votes


















0














You can use Mockito to mock the BufferedReader, like the example below.



BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
Mockito.when(bufferedReader.readLine()).thenReturn("1", "2", "3");
// You can mock the result based on the type of result you are expecting.





share|improve this answer





















  • But he must pass that mock first.
    – Antoniossss
    Nov 20 at 12:37



















3
















  1. Extract the reader as a field. (You can initiaize it either directly or in constructor)



    private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));



  2. Define a getter (either public or protected)



    protected BufferedReader getReader(){
    return reader;
    }



  3. Remove initialization of new BufferedReader(...) from your method. Retrieve it using getReader() instead.



    public Cell readInput() {
    try {
    System.out.print("Enter the co-ordinate Seperated by Comma");
    String coOrdinates = getReader().readLine();
    String values=coOrdinates.split("\,");
    return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
    } catch (IOException ioe) {
    ioe.printStackTrace();
    }
    return null;
    }



  4. In your test class initialize your ConsoleReader as Mockito.spy



    ConsoleReader consoleReader = spy(new ConsoleReader());



  5. Mock your getter



    @Before
    public void setUp() {
    BufferedReader bufferedReader = mock(BufferedReader.class);
    doReturn(bufferedReader).when(consoleReader).getReader();
    doCallRealMethod().when(consoleReader).readInput();
    }



  6. Define your test:



    @Test
    public void testReadInput() {
    when(bufferedReader.readLine()).thenReturn("123,456");

    Cell expectedCell = new Cell(123, 456);
    Cell actualCell = consoleReader.readInput();

    assertEquals(expectedCell, actualCell);
    }







share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392599%2fjunit-test-for-inputstreamreader-with-mockito%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    You can use Mockito to mock the BufferedReader, like the example below.



    BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
    Mockito.when(bufferedReader.readLine()).thenReturn("1", "2", "3");
    // You can mock the result based on the type of result you are expecting.





    share|improve this answer





















    • But he must pass that mock first.
      – Antoniossss
      Nov 20 at 12:37
















    0














    You can use Mockito to mock the BufferedReader, like the example below.



    BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
    Mockito.when(bufferedReader.readLine()).thenReturn("1", "2", "3");
    // You can mock the result based on the type of result you are expecting.





    share|improve this answer





















    • But he must pass that mock first.
      – Antoniossss
      Nov 20 at 12:37














    0












    0








    0






    You can use Mockito to mock the BufferedReader, like the example below.



    BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
    Mockito.when(bufferedReader.readLine()).thenReturn("1", "2", "3");
    // You can mock the result based on the type of result you are expecting.





    share|improve this answer












    You can use Mockito to mock the BufferedReader, like the example below.



    BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
    Mockito.when(bufferedReader.readLine()).thenReturn("1", "2", "3");
    // You can mock the result based on the type of result you are expecting.






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Nov 20 at 12:33









    joemokenela

    1465




    1465












    • But he must pass that mock first.
      – Antoniossss
      Nov 20 at 12:37


















    • But he must pass that mock first.
      – Antoniossss
      Nov 20 at 12:37
















    But he must pass that mock first.
    – Antoniossss
    Nov 20 at 12:37




    But he must pass that mock first.
    – Antoniossss
    Nov 20 at 12:37













    3
















    1. Extract the reader as a field. (You can initiaize it either directly or in constructor)



      private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));



    2. Define a getter (either public or protected)



      protected BufferedReader getReader(){
      return reader;
      }



    3. Remove initialization of new BufferedReader(...) from your method. Retrieve it using getReader() instead.



      public Cell readInput() {
      try {
      System.out.print("Enter the co-ordinate Seperated by Comma");
      String coOrdinates = getReader().readLine();
      String values=coOrdinates.split("\,");
      return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
      } catch (IOException ioe) {
      ioe.printStackTrace();
      }
      return null;
      }



    4. In your test class initialize your ConsoleReader as Mockito.spy



      ConsoleReader consoleReader = spy(new ConsoleReader());



    5. Mock your getter



      @Before
      public void setUp() {
      BufferedReader bufferedReader = mock(BufferedReader.class);
      doReturn(bufferedReader).when(consoleReader).getReader();
      doCallRealMethod().when(consoleReader).readInput();
      }



    6. Define your test:



      @Test
      public void testReadInput() {
      when(bufferedReader.readLine()).thenReturn("123,456");

      Cell expectedCell = new Cell(123, 456);
      Cell actualCell = consoleReader.readInput();

      assertEquals(expectedCell, actualCell);
      }







    share|improve this answer


























      3
















      1. Extract the reader as a field. (You can initiaize it either directly or in constructor)



        private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));



      2. Define a getter (either public or protected)



        protected BufferedReader getReader(){
        return reader;
        }



      3. Remove initialization of new BufferedReader(...) from your method. Retrieve it using getReader() instead.



        public Cell readInput() {
        try {
        System.out.print("Enter the co-ordinate Seperated by Comma");
        String coOrdinates = getReader().readLine();
        String values=coOrdinates.split("\,");
        return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
        } catch (IOException ioe) {
        ioe.printStackTrace();
        }
        return null;
        }



      4. In your test class initialize your ConsoleReader as Mockito.spy



        ConsoleReader consoleReader = spy(new ConsoleReader());



      5. Mock your getter



        @Before
        public void setUp() {
        BufferedReader bufferedReader = mock(BufferedReader.class);
        doReturn(bufferedReader).when(consoleReader).getReader();
        doCallRealMethod().when(consoleReader).readInput();
        }



      6. Define your test:



        @Test
        public void testReadInput() {
        when(bufferedReader.readLine()).thenReturn("123,456");

        Cell expectedCell = new Cell(123, 456);
        Cell actualCell = consoleReader.readInput();

        assertEquals(expectedCell, actualCell);
        }







      share|improve this answer
























        3












        3








        3








        1. Extract the reader as a field. (You can initiaize it either directly or in constructor)



          private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));



        2. Define a getter (either public or protected)



          protected BufferedReader getReader(){
          return reader;
          }



        3. Remove initialization of new BufferedReader(...) from your method. Retrieve it using getReader() instead.



          public Cell readInput() {
          try {
          System.out.print("Enter the co-ordinate Seperated by Comma");
          String coOrdinates = getReader().readLine();
          String values=coOrdinates.split("\,");
          return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
          } catch (IOException ioe) {
          ioe.printStackTrace();
          }
          return null;
          }



        4. In your test class initialize your ConsoleReader as Mockito.spy



          ConsoleReader consoleReader = spy(new ConsoleReader());



        5. Mock your getter



          @Before
          public void setUp() {
          BufferedReader bufferedReader = mock(BufferedReader.class);
          doReturn(bufferedReader).when(consoleReader).getReader();
          doCallRealMethod().when(consoleReader).readInput();
          }



        6. Define your test:



          @Test
          public void testReadInput() {
          when(bufferedReader.readLine()).thenReturn("123,456");

          Cell expectedCell = new Cell(123, 456);
          Cell actualCell = consoleReader.readInput();

          assertEquals(expectedCell, actualCell);
          }







        share|improve this answer














        1. Extract the reader as a field. (You can initiaize it either directly or in constructor)



          private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));



        2. Define a getter (either public or protected)



          protected BufferedReader getReader(){
          return reader;
          }



        3. Remove initialization of new BufferedReader(...) from your method. Retrieve it using getReader() instead.



          public Cell readInput() {
          try {
          System.out.print("Enter the co-ordinate Seperated by Comma");
          String coOrdinates = getReader().readLine();
          String values=coOrdinates.split("\,");
          return new Cell(Integer.parseInt(values[0]),Integer.parseInt(values[1]));
          } catch (IOException ioe) {
          ioe.printStackTrace();
          }
          return null;
          }



        4. In your test class initialize your ConsoleReader as Mockito.spy



          ConsoleReader consoleReader = spy(new ConsoleReader());



        5. Mock your getter



          @Before
          public void setUp() {
          BufferedReader bufferedReader = mock(BufferedReader.class);
          doReturn(bufferedReader).when(consoleReader).getReader();
          doCallRealMethod().when(consoleReader).readInput();
          }



        6. Define your test:



          @Test
          public void testReadInput() {
          when(bufferedReader.readLine()).thenReturn("123,456");

          Cell expectedCell = new Cell(123, 456);
          Cell actualCell = consoleReader.readInput();

          assertEquals(expectedCell, actualCell);
          }








        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 20 at 15:06









        ETO

        1,589320




        1,589320






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53392599%2fjunit-test-for-inputstreamreader-with-mockito%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Ottavio Pratesi

            Tricia Helfer

            15 giugno