gpt4 book ai didi

java - 文件解析和翻译的单元测试

转载 作者:行者123 更新时间:2023-12-01 20:03:07 25 4
gpt4 key购买 nike

如何为以下方法编写单元测试 - 使其与输入文件无关?

看来,业务对象的读取和翻译是不同的职责 - 需要分开。

这将使业务翻译变得可测试。

欢迎任何建议。

    public Map<header,record> createTradeFeedRecords(String tradeFile,String config) throws Exception {
Map<header,record> feedRecordMap =
new LinkedHashMap<>();
try (BufferedReader reader = new BufferedReader(new FileReader(tradeFile))) {
for (String line; (line = reader.readLine()) != null;) {
if (line.trim().isEmpty() || line.startsWith("#") )
continue;

Record record = recordParser.extractTradeFeedRecord(line,config):
feedRecordMap .put(record.getHeader(), record) ;

}
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {

}
return feedRecordMap ;
}

最佳答案

您可以使用 JUnit 的 TemporaryFolder规则(或者,如果使用 JUnit5,则为 equivalent extension )为您的测试创建输入文件。然后,您将在 tradeFile 中提供此文件的路径。参数和您的测试将在您创建的文件上运行。测试完成后,JUnit 将丢弃临时文件夹,从而遵循 self 包含的测试原则。

我认为,这是最接近反射(reflect) createTradeFeedRecords实际行为的方法。方法。

但是,如果您真的不想在测试中使用文件系统,或者实际上只是想实现这一目标..

It seems that the reading and translation into business objects are distinct responsibilities - which need to be separate.

...然后你可以提取new FileReader(tradeFile)在接口(interface)后面调用。也许是这样的:

public interface TradeReader {
Reader read(String input);
}

这个的“正常”实现是:

public class FileTradeReader implements TradeReader {
@Override
public Reader read(String input) {
return new FileReader(input);
}
}

然后您可以提供此实现以在您的测试用例中使用:

public class StubTradeReader implements TradeReader {
@Override
public Reader read(String input) {
return new StringReader(input);
}
}

在您的测试中,您将使用 createTradeFeedRecords 的实例注入(inject)被测类(即包含 StubTradeReader 的类)。 。这样,createTradeFeedRecords测试中调用的方法将根据您在创建 StubTradeReader 时提供的任何输入进行操作并且您的测试不会与文件系统进行交互。

您还可以测试 TradeReader分开(也许使用上面概述的临时文件夹方法),从而实现独立地分离阅读、翻译和测试的目标。

关于java - 文件解析和翻译的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47787437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com