Java 有没有办法知道文件阅读器指向的文件?

Java 有没有办法知道文件阅读器指向的文件?,java,junit,testng,filereader,filewriter,Java,Junit,Testng,Filereader,Filewriter,我试图用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 IOExceptio

我试图用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));
}
我拥有的测试类如下(createFileIfNotExists(字符串路径)和getFile(字符串路径)的测试都已通过):

但由于以下原因,initiateFileWriter和initiateFileReader的测试均失败:

initiateFileReader故障:

java.lang.AssertionError:应为:java.io。FileReader@53a07924但是它是:java.io。FileReader@4c715560

initiateFileWriter故障:

java.lang.AssertionError:应为:java.io。FileWriter@4960e09f但是它是:java.io。FileWriter@773b0c5b

我认为这是因为预期的和实际的
FileWriter
/
FileReader
是不同的对象,但是。。。如果两个对象是等价的而不是指向同一个实例,那么不应该假设
assertEquals
方法比较吗

是否存在从
文件编写器
/
文件读取器
调用的方法,并知道它们指向哪个文件?因为这样我可以解决这样的问题:

assertEquals(expectedFileWriter.getFileToWhichI'mPointing(),actualFileWriter.getFileToWhichI'mPointing())

assertEquals(expectedFileReader.getFileToWhichI'mPointing(),actualFileReader.getFileToWhichI'mPointing())

FileReader
/
FileWriter
上没有任何方法可以告诉您它指向什么文件(因为理论上您永远不需要知道-这就是为什么您使用的是阅读器,而不是
文件

您可以使用反射来读取底层
FileInputStream
/
FileOutputStream
的私有字段

但是我认为正确的方法是不要测试不能破坏的东西,也就是说,不要测试Java核心库。除非发布的代码是简化版本,
testInitiateFileWriter()
有效地测试了
新文件编写器(getFile(path),false)
,并且您已经知道
getFile(path)
可以工作(根据您通过的测试),所以您在这里测试的唯一内容是
新文件编写器(…)


脚注:当然,Java库可能会破坏/包含bug,但在大多数情况下,对于FileReader/FileWriter这样广泛使用的部分来说,这种可能性微乎其微。

FileReader
/
FileWriter
上没有方法告诉您它指向的是什么文件(因为从理论上讲,您永远不需要知道-这就是为什么您使用的是阅读器而不是
文件

您可以使用反射来读取底层
FileInputStream
/
FileOutputStream
的私有字段

但是我认为正确的方法是不要测试不能破坏的东西,也就是说,不要测试Java核心库。除非发布的代码是一个简化版本,
testInitiateFileWriter()
有效地测试了
新的FileWriter(getFile(path),false)
,您已经知道
getFile>(path)
工作正常(根据您通过的测试),因此您在这里测试的唯一内容是
新的FileWriter(…)


脚注:当然,Java库可能会破坏/包含bug,但在大多数情况下,对于FileReader/FileWriter这样广泛使用的部分,这种可能性微乎其微。

FileReader
不会覆盖
equals()
,因此两个不同的
文件读取器
将永远不会相等。我假设这同样适用于
文件编写器
。您不需要前两种方法。
new FileWriter()
完全可以在没有您任何帮助的情况下创建文件。您也不需要另外两种方法:只需调用
new FileWriter()
新文件阅读器()
直接在您的代码中。这样您就没有什么可测试的了,并且消除了整个问题。您似乎只是在测试平台。不要浪费时间这样做。您的测试代码比您正在测试的代码长,而这些都不是一开始就需要的。
FileReader
不会覆盖
equals()
,因此两个不同的
文件读取器
将永远不会相等。我假设这同样适用于
文件编写器
。您不需要前两种方法。
new FileWriter()
完全可以在没有您任何帮助的情况下创建文件。您也不需要另外两种方法:只需调用
new FileWriter()
新文件阅读器()
直接在您的代码中。这样您就没有什么可测试的了,并且消除了整个问题。您似乎只是在测试平台。不要浪费时间这么做。您的测试代码比您正在测试的代码长,一开始没有任何必要。谢谢。您完全正确。当我试图取消我的代码,我犯了一个错误,写一个方法只是为了模拟
FileInputStream/FileOutputStream
功能,这没有什么意义。你完全正确。当我试图取消代码的着色时,我犯了一个错误,写一个方法只是为了模拟
FileInputStream/FileOutputStream
功能和这毫无意义
assertEquals(expectedFileWriter.getFileToWhichI'mPointing(),actualFileWriter.getFileToWhichI'mPointing())

assertEquals(expectedFileReader.getFileToWhichI'mPointing(),actualFileReader.getFileToWhichI'mPointing())