2012-02-02 216 views
4

我有一段类似于下面的代码,我被要求进行Junit测试。我们正在使用Junit,EasyMock和Spring Framework。我没有做过很多的Junit测试,并且在如何嘲笑下面的方面有点失落。Junit测试嘲笑文件操作

当我在我的机器上编写或运行测试时,基本上与目录中文件的路径不同,我想知道是否有办法将对象模拟到临时位置,因为它将实际运行的位置保证存在并在集成测试期间进行测试。

但是我想知道这样做是明智的做法还是应该在与目录实际存在时与项目的其余部分集成时进行测试。

任何帮助表示赞赏,因为Junit测试对我来说是全新的。我环顾四周,但看不到我想做的事情(可能是我不应该这样做的一个好提示:P)。

String fileName = pathToFileName; 

File file = new File(fileName); 

if (file.exists()) { 

    FileUtil.removeLineFromFile(file, getValueToRemove(serialNumber)); 
} 

回答

3

第一个选项是将文件注入到类中,您可以直接注入模拟。通常更好的选择,但不总是优雅或可行。

通过为有问题的对象创建一个受保护的包装函数,我已经获得了一些里程碑。在测试下你的类:

protected File OpenFile(String fileName) { return new File(filename;} 

在测试类:

File file = EasyMock.createNiceMock(File.class); 

private MyClass createMyClass() { 
    return new MyClass() { 
    @Override protected File OpenFile(String fileName) { return file; } 
    }; 
} 

@Test public testFoo() { 
    EasyMock.expect(file.exists()).andStubReturn(true); 
    //... 
    MyClass myClass=createMyClass(); 
    // ... 
} 

如果你需要,你可以节省掉在这种情况下,用于验证的施工参数(文件名)。

+0

'MyClass'类将不知道您在生产中创建的'file'。 – 2016-03-24 15:32:49