通过 JUnit 模拟文件 reading/writing
Mocking file reading/writing via JUnit
如何通过 JUnit 模拟文件 reading/writing?
这是我的场景
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);
然而,我做了一些阅读,当 Windows 机器上的 运行 时,setReadable()
总是 returns false(失败)。
有没有办法以编程方式修改与 JUnit 相关的目标文件的文件权限?
备注
Target source code to test cannot be modified, meaning
Myhandler.class
is a legacy code which is not to be modified.
不依赖于操作系统文件权限,而是使用 PowerMock 模拟 FileUtils.getFile(...) 并使其 return 成为 File 的一个实例(例如匿名子 class ) return 是 canWrite()/canRead() 的特定值。
Mocking static methods with Mockito
由于 Mockito 无法模拟静态方法,请改用 File
工厂(或将您的 FileUtils
重构为工厂),然后您可以模拟它并 return 模拟 File
实例,您还可以在其中模拟任何您想要的 File
方法。
因此,您现在将拥有 FileFactory.getInstance().getFile(filepath)
之类的东西,而不是 FileUtils.getFile(filepath)
,您可以在其中轻松模拟 getFile(String)
方法。
在 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.
}
如何通过 JUnit 模拟文件 reading/writing?
这是我的场景
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);
然而,我做了一些阅读,当 Windows 机器上的 运行 时,setReadable()
总是 returns false(失败)。
有没有办法以编程方式修改与 JUnit 相关的目标文件的文件权限?
备注
Target source code to test cannot be modified, meaning
Myhandler.class
is a legacy code which is not to be modified.
不依赖于操作系统文件权限,而是使用 PowerMock 模拟 FileUtils.getFile(...) 并使其 return 成为 File 的一个实例(例如匿名子 class ) return 是 canWrite()/canRead() 的特定值。
Mocking static methods with Mockito
由于 Mockito 无法模拟静态方法,请改用 File
工厂(或将您的 FileUtils
重构为工厂),然后您可以模拟它并 return 模拟 File
实例,您还可以在其中模拟任何您想要的 File
方法。
因此,您现在将拥有 FileFactory.getInstance().getFile(filepath)
之类的东西,而不是 FileUtils.getFile(filepath)
,您可以在其中轻松模拟 getFile(String)
方法。
在 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.
}