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 '18 at 12:10











  • Possible duplicate of Mocking Java InputStream

    – Renny
    Nov 20 '18 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 '18 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 '18 at 12:10











  • Possible duplicate of Mocking Java InputStream

    – Renny
    Nov 20 '18 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 '18 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 '18 at 12:08







Sunny

















asked Nov 20 '18 at 12:02









SunnySunny

17013




17013








  • 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 '18 at 12:10











  • Possible duplicate of Mocking Java InputStream

    – Renny
    Nov 20 '18 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 '18 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 '18 at 12:10











  • Possible duplicate of Mocking Java InputStream

    – Renny
    Nov 20 '18 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 '18 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 '18 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 '18 at 12:10













Possible duplicate of Mocking Java InputStream

– Renny
Nov 20 '18 at 13:01





Possible duplicate of Mocking Java InputStream

– Renny
Nov 20 '18 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 '18 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 '18 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 '18 at 12:37



















2
















  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 '18 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 '18 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 '18 at 12:33









    joemokenelajoemokenela

    1616




    1616













    • But he must pass that mock first.

      – Antoniossss
      Nov 20 '18 at 12:37



















    • But he must pass that mock first.

      – Antoniossss
      Nov 20 '18 at 12:37

















    But he must pass that mock first.

    – Antoniossss
    Nov 20 '18 at 12:37





    But he must pass that mock first.

    – Antoniossss
    Nov 20 '18 at 12:37













    2
















    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




























      2
















      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


























        2












        2








        2









        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 '18 at 15:06









        ETOETO

        2,6231628




        2,6231628






























            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.




            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

            Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

            ComboBox Display Member on multiple fields

            Is it possible to collect Nectar points via Trainline?