通过JUnit

时间:2019-01-18 11:50:00

标签: java junit mockito powermockito

您如何模拟通过JUnit进行文件读取/写入?

这是我的情况

MyHandler.java

public abstract class MyHandler {

    private String path = //..path/to/file/here

    public synchronized void writeToFile(String infoText) {
        // Some processing
        // Writing to File Here
        File file = FileUtils.getFile(filepath);
        file.createNewFile();
        // file can't be written, throw FileWriteException
        if (file.canWrite()) {
            FileUtils.writeByteArrayToFile(file, infoText.getBytes(Charsets.UTF_8));
        } else {
            throw new FileWriteException();
        }
    }

    public String readFromFile() {
        // Reading from File here
        String infoText = "";
        File file = new File(path);
        // file can't be read, throw FileReadException
        if (file.canRead()) {
            infoText = FileUtils.readFileToString(file, Charsets.UTF_8);        
        } else {
            throw FileReadException();
        }

        return infoText
    }

}

MyHandlerTest.java

@RunWith(PowerMockRunner.class)
@PrepareForTest({
    MyHandler.class
})
public class MyHandlerTest {

    private static MyHandler handler = null;
    // Some Initialization for JUnit (i.e @Before, @BeforeClass, @After, etc)

    @Test(expected = FileWriteException.class)
    public void writeFileTest() throws Exception {

       handler.writeToFile("Test Write!");

    }

    @Test(expected = FileReadException.class)
    public void readFileTest() throws Exception {

       handler.readFromFile();

    }
}

鉴于上述来源,文件不可写的情况(不允许写许可)是可以的,但是,当我尝试做file不可读的情况(不允许读许可)时。它总是读取文件,我已经尝试通过下面的命令修改测试代码上的文件权限

File f = new File("..path/to/file/here");
f.setReadable(false);

但是,我做了一些阅读,setReadable()在Windows计算机上运行时始终返回false(失败)。

是否可以通过编程方式相对于JUnit修改目标文件的文件权限?

注意

  

无法修改要测试的目标源代码,这意味着   Myhandler.class是遗留代码,请勿修改。

3 个答案:

答案 0 :(得分:2)

使用PowerMock模拟FileUtils.getFile(...)并使其返回File的实例(例如,匿名子类),该实例为canWrite()/ canRead返回特定值,而不是依赖于操作系统文件权限。 ()。

Mocking static methods with Mockito

答案 1 :(得分:0)

由于Mockito无法模拟静态方法,请改用File工厂(或将FileUtils重构为工厂),然后可以对其进行模拟并返回模拟的File实例,如下所示:好,您还可以在其中模拟所需的任何File方法。

因此,例如,您现在可以使用FileUtils.getFile(filepath)之类的东西来代替FileFactory.getInstance().getFile(filepath)了,可以轻松模拟getFile(String)方法。

答案 2 :(得分:0)

在jUnit中,对于像您这样的场景有一个方便的规则。

public class MyHandlerTest {

    @Rule
    // creates a temp folder that will be removed after each test
    public org.junit.rules.TemporaryFolder folder = new org.junit.rules.TemporaryFolder();

    private MyHandler handler;

    @Before
    public void setUp() throws Exception {
        File file = folder.newFile("myFile.txt");
        // do whatever you need with it - fill with test content and so on.
        handler = new MyHandler(file.getAbsolutePath()); // use the real thing
    }

    // Test whatever behaviour you need with a real file and predefined dataset.
}