Java 有没有办法知道文件阅读器指向的文件?
我试图用TestNG框架测试这段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
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())