有什么方法可以知道 FileReader 指向的文件?
Any way to know the file to which a FileReader is pointing at?
我正在尝试使用 TestNG 框架测试这段 Java 代码:
public static void createFileIfNotExists(String path) throws IOException{
File file = new File(path);
if(!file.exists()){
file.createNewFile();
}
}
public static File getFile(String path) throws IOException{
createFileIfNotExists(path);
return new File (path);
}
public static FileWriter initiateFileWriter (String path) throws IOException{
return new FileWriter (getFile(path),false);
}
public static FileReader initiateFileReader (String path) throws IOException{
return new FileReader (getFile(path));
}
我进行的测试 class 如下(createFileIfNotExists(String path) 和 getFile(String path) 的测试均已通过):
File expectedFile, actualFile;
String path;
@BeforeMethod
public void setUp() {
path = "fixtures\prueba.txt";
expectedFile = new File(path);
}
@BeforeGroups(groups = "IOReader")
public void setUpIOReader() throws IOException {
FileBody.createFileIfNotExists(path);
}
public void testCreateFileIfNotExists() throws IOException {
FileBody.createFileIfNotExists(path);
assertTrue(expectedFile.exists());
}
public void testGetFile() throws IOException {
actualFile = FileBody.getFile(path);
assertEquals(expectedFile, actualFile);
}
public void testInitiateFileWriter() throws IOException {
FileWriter expectedFileWriter = new FileWriter(expectedFile,false);
FileWriter actualFileWriter = FileBody.initiateFileWriter(path);
assertEquals(expectedFileWriter, actualFileWriter);
expectedFileWriter.close();
actualFileWriter.close();
}
@Test(groups = {"IOReader"})
public void testInitiateFileReader() throws IOException {
FileReader expectedFileReader = new FileReader(expectedFile);
FileReader actualFileReader = FileBody.initiateFileReader(path);
assertEquals(expectedFileReader, actualFileReader);
expectedFileReader.close();
actualFileReader.close();
}
但是由于以下原因,initiateFileWriter 和 initiateFileReader 的测试都失败了:
initiateFileReader 失败:
java.lang.AssertionError: expected:java.io.FileReader@53a07924 but was:java.io.FileReader@4c715560
initiateFileWriter 失败:
java.lang.AssertionError: expected:java.io.FileWriter@4960e09f but was:java.io.FileWriter@773b0c5b
我认为这是因为预期的和实际的 FileWriter
/FileReader
是不同的对象但是...如果两个对象是,assertEquals
方法不应该比较吗等效而不是指向同一个实例?
是否存在从 FileWriter
/FileReader
调用并知道它们指向哪个文件的方法?因为这样我可以这样解决问题:
assertEquals(expectedFileWriter.getFileToWhichI'mPointing(),actualFileWriter.getFileToWhichI'mPointing())
assertEquals(expectedFileReader.getFileToWhichI'mPointing(),actualFileReader.getFileToWhichI'mPointing())
FileReader
/FileWriter
上没有任何方法可以告诉您它指向哪个文件(因为理论上您永远不需要知道 - 这就是您使用 reader 而不是 File
).
您可以使用反射来读取底层 FileInputStream
/FileOutputStream
的私有字段。
但我认为正确的做法是不要测试不能破坏的东西——也就是说,不要测试Java 核心库。除非发布的代码是简化版本,否则 testInitiateFileWriter()
正在有效地测试 new FileWriter (getFile(path),false)
,并且您已经知道 getFile(path)
有效(根据您通过的测试),所以您唯一要测试的是这里是 new FileWriter(...)
.
脚注:当然 Java 库 可以 破坏/包含错误,但在大多数情况下这种机会可以忽略不计,对于 [=33 这样广泛使用的部分=].
我正在尝试使用 TestNG 框架测试这段 Java 代码:
public static void createFileIfNotExists(String path) throws IOException{
File file = new File(path);
if(!file.exists()){
file.createNewFile();
}
}
public static File getFile(String path) throws IOException{
createFileIfNotExists(path);
return new File (path);
}
public static FileWriter initiateFileWriter (String path) throws IOException{
return new FileWriter (getFile(path),false);
}
public static FileReader initiateFileReader (String path) throws IOException{
return new FileReader (getFile(path));
}
我进行的测试 class 如下(createFileIfNotExists(String path) 和 getFile(String path) 的测试均已通过):
File expectedFile, actualFile;
String path;
@BeforeMethod
public void setUp() {
path = "fixtures\prueba.txt";
expectedFile = new File(path);
}
@BeforeGroups(groups = "IOReader")
public void setUpIOReader() throws IOException {
FileBody.createFileIfNotExists(path);
}
public void testCreateFileIfNotExists() throws IOException {
FileBody.createFileIfNotExists(path);
assertTrue(expectedFile.exists());
}
public void testGetFile() throws IOException {
actualFile = FileBody.getFile(path);
assertEquals(expectedFile, actualFile);
}
public void testInitiateFileWriter() throws IOException {
FileWriter expectedFileWriter = new FileWriter(expectedFile,false);
FileWriter actualFileWriter = FileBody.initiateFileWriter(path);
assertEquals(expectedFileWriter, actualFileWriter);
expectedFileWriter.close();
actualFileWriter.close();
}
@Test(groups = {"IOReader"})
public void testInitiateFileReader() throws IOException {
FileReader expectedFileReader = new FileReader(expectedFile);
FileReader actualFileReader = FileBody.initiateFileReader(path);
assertEquals(expectedFileReader, actualFileReader);
expectedFileReader.close();
actualFileReader.close();
}
但是由于以下原因,initiateFileWriter 和 initiateFileReader 的测试都失败了:
initiateFileReader 失败:
java.lang.AssertionError: expected:java.io.FileReader@53a07924 but was:java.io.FileReader@4c715560
initiateFileWriter 失败:
java.lang.AssertionError: expected:java.io.FileWriter@4960e09f but was:java.io.FileWriter@773b0c5b
我认为这是因为预期的和实际的 FileWriter
/FileReader
是不同的对象但是...如果两个对象是,assertEquals
方法不应该比较吗等效而不是指向同一个实例?
是否存在从 FileWriter
/FileReader
调用并知道它们指向哪个文件的方法?因为这样我可以这样解决问题:
assertEquals(expectedFileWriter.getFileToWhichI'mPointing(),actualFileWriter.getFileToWhichI'mPointing())
assertEquals(expectedFileReader.getFileToWhichI'mPointing(),actualFileReader.getFileToWhichI'mPointing())
FileReader
/FileWriter
上没有任何方法可以告诉您它指向哪个文件(因为理论上您永远不需要知道 - 这就是您使用 reader 而不是 File
).
您可以使用反射来读取底层 FileInputStream
/FileOutputStream
的私有字段。
但我认为正确的做法是不要测试不能破坏的东西——也就是说,不要测试Java 核心库。除非发布的代码是简化版本,否则 testInitiateFileWriter()
正在有效地测试 new FileWriter (getFile(path),false)
,并且您已经知道 getFile(path)
有效(根据您通过的测试),所以您唯一要测试的是这里是 new FileWriter(...)
.
脚注:当然 Java 库 可以 破坏/包含错误,但在大多数情况下这种机会可以忽略不计,对于 [=33 这样广泛使用的部分=].