我很难为我的烫伤工作进行单元测试。
我的工作需要一个包含三个字段的文件:
TextLine(args("input"))
.map('url -> ('fetchedUrl,'date,'info)){
...
天真的我会期望字段被映射为nTuple,而无需任何进一步的设置。但是从我的测试中我发现它不是那样的,需要建立一些进一步的合同:
JobTest[com.kohls.crawler.Miner]
.arg("input", "inputFile")
.arg("output", "outputFile")
.source(TextLine("inputFile"), List(("https://en.wikipedia.org/wiki/Test" ,"Mon Apr 14 15:08:11 CDT 2014", "extra info")))
.sink[(String,Date,Array[Byte])](Tsv("outputFile")){ ... }
目前这与cascading.tuple.FieldsResolverException: could not select fields: [{1}:'url'], from: [{2}:'offset', 'line']
失败。所以我猜测我需要以某种方式声明TSV字段,然后再将它作为TextLine的输入提供。
我发现的大多数文档在这方面都不稳定。 定义此测试的正确原因是什么?
答案 0 :(得分:3)
您应该使用Tsv
代替TextLine
。 Tsv
将声明的字段作为第二个输入参数。你的工作看起来像这样:
Tsv(args("input"), ('fetchedUrl,'date,'info), skipHeader = false/true).read
.map(...)
.write(Tsv(args("output"), writeHeader = false/true)
你的工作测试如下:
JobTest[com.kohls.crawler.Miner]
.arg("input", "inputFile")
.arg("output", "outputFile")
.source(Tsv("inputFile"), List(("https://en.wikipedia.org/wiki/Test" ,"Mon Apr 14 15:08:11 CDT 2014", "extra info")))
.sink[(String,Date,Array[Byte])](Tsv("outputFile")) { ... }
.run
.finish
答案 1 :(得分:2)
当然,您可以在测试中模拟TextLine。诀窍是提供隐藏的'line
字段。
JobTest[com.kohls.crawler.Miner]
.arg("input", "inputFile")
.arg("output", "outputFile")
.source(TextLine("inputFile"), List((
0 -> "https://en.wikipedia.org/wiki/Test" ,
1 -> "Mon Apr 14 15:08:11 CDT 2014",
2 -> "extra info")))
.sink[(String,Date,Array[Byte])](Tsv("outputFile")){ ... }