有什么方法可以知道 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 这样广泛使用的部分=].