【问题标题】:Mock File, FileReader and BufferedReader class using Mockito使用 Mockito 模拟 File、FileReader 和 BufferedReader 类
【发布时间】:2015-04-11 08:30:11
【问题描述】:

我在一个我想测试的方法中得到了下面的代码

File f = map.get("key1")
BuffereReader r = new BufferedReader(new FileReader(f));
String line=null;
do {
    line=r.readLine();
} while(r!=null);

我想模拟这个操作,以便我可以从 JUnit 测试用例中传递文件的内容。我在下面做了:

Map fles = Mockito.mock(ConcurrentHashMap.class);
File file = Mockito.mock(File.class);
Mockito.when(files.get("key1")).thenReturn(file);

FileReader fileReader = Mockito.mock(FileReader.class);
BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);

try {
     PowerMockito.whenNew(FileReader.class).withArguments(file).thenReturn(fileReader);
     PowerMockito.whenNew(BufferedReader.class).withArguments(fileReader).thenReturn(bufferedReader);
     PowerMockito.when(bufferedReader.readLine()).thenReturn("line1")
         .thenReturn("line2").thenReturn("line3");

    } catch (Exception e) {
        Assert.fail();
    }

所以基本上我需要将“line1”、“line2”和“line3”作为文件中的行传递给模拟的 BufferedReader。

但是,在尝试实例化新的 FileReader(f) 部件时,它会以 NullPointerException 失败。

是因为我无法模拟 BufferedReader 还是方法不对?

谢谢

【问题讨论】:

    标签: java junit4 mockito


    【解决方案1】:

    您可以提取一种方法来进行实际阅读,然后对其进行测试。这意味着你只需要嘲笑一个读者。例如,您的代码将是这样的:

    public void aMethod(){
        File f = map.get("key1")
        BuffereReader r = new BufferedReader(new FileReader(f));
        readStuff(r);
    }
    
    public void readStuff(BufferedReader r){
        String line=null;
        do {
            line=r.readLine();
        } while(r!=null);
    }
    

    那么你的测试代码会更像下面这样:

    BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
    Mockito.when(bufferedReader.readLine()).thenReturn("line1", "line2", "line3");
    objUnderTest.readStuff(bufferedReader);
    //verify result
    

    【讨论】:

    • +1 重写测试,但此时您甚至不需要模拟 BufferedReader;你可以直接跳到new BufferedReader(new StringReader("line1\nline2\nline3"))
    【解决方案2】:

    您可以尝试 PowerMock 注释。检查这个:https://code.google.com/p/powermock/wiki/MockConstructor

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2014-09-24
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多