代码之家  ›  专栏  ›  技术社区  ›  Sunny

带mockito的inputstreamreader的JUnit测试

  •  3
  • Sunny  · 技术社区  · 6 年前

    您能帮我为下面的代码编写JUnit测试用例吗?

    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;
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   joemokenela    6 年前

    您可以使用mockito模拟BufferedReader,如下例所示。

    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.
    
        2
  •  2
  •   ETO    6 年前
    1. 提取 reader 作为一个领域。(您可以直接或在构造函数中初始化它)

      private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
      
    2. 定义getter(或者 public protected )

      protected BufferedReader getReader(){
          return reader;
      }
      
    3. 删除的初始化 new BufferedReader(...) 从你的方法。使用 getReader() 相反。

      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. 在测试类中,初始化 ConsoleReader 作为 Mockito.spy

      ConsoleReader consoleReader = spy(new ConsoleReader());
      
    5. 嘲笑你的能手

      @Before
      public void setUp() {
          BufferedReader bufferedReader = mock(BufferedReader.class);
          doReturn(bufferedReader).when(consoleReader).getReader();
          doCallRealMethod().when(consoleReader).readInput();
      }
      
    6. 定义测试:

      @Test
      public void testReadInput() {
          when(bufferedReader.readLine()).thenReturn("123,456");
      
          Cell expectedCell = new Cell(123, 456);
          Cell actualCell = consoleReader.readInput();
      
          assertEquals(expectedCell, actualCell);   
      }