Spock:GroovyMock不需要的实方法调用
我有一个这样的测试Spock:GroovyMock不需要的实方法调用,groovy,mocking,spock,Groovy,Mocking,Spock,我有一个这样的测试 def "fileField should be set for each line batch"(){ given: LuceneEngine le = new LuceneEngine() le.indexWriter = Mock( IndexWriter ){ addDocument(_) >> null } le.currentFilename = 'dummy filename' le
def "fileField should be set for each line batch"(){
given:
LuceneEngine le = new LuceneEngine()
le.indexWriter = Mock( IndexWriter ){
addDocument(_) >> null
}
le.currentFilename = 'dummy filename'
le.fileField = GroovyMock( TextField )
when:
le.processLineBatch([ 'dummy text' ], 0 )
then:
1 * le.fileField.setStringValue( 'dummy filename' ) >> null
}
应用程序方法如下所示:
def processLineBatch( List lineBatch, int deliveryNo ) {
String lDocText = lineBatch.join( '\n' ).trim()
textField.setStringValue( lDocText )
fileField.setStringValue( currentFilename )
indexWriter.addDocument( singleLDoc )
}
我必须对TextField
使用GroovyMock
,因为类是final
无论我做什么(我已经尝试了很多事情),实际的方法setStringValue
都会运行。。。然后生成一个异常
,因为这是一个模拟
有关详细信息,故障如下所示:
def processLineBatch( List lineBatch, int deliveryNo ) {
String lDocText = lineBatch.join( '\n' ).trim()
textField.setStringValue( lDocText )
fileField.setStringValue( currentFilename )
indexWriter.addDocument( singleLDoc )
}
java.lang.NullPointerException位于 org.apache.lucene.document.Field.setStringValue(Field.java:307)
org.spockframework.mock.runtime.GroovyMockMetaClass.doInvokeMethod(GroovyMockMetaClass.java:86)
在 org.spockframework.mock.runtime.GroovyMockMetaClass.invokeMethod(GroovyMockMetaClass.java:42)
位于core.LuceneEngine.processLineBatch(lucene_functions.groovy:422) 。。。其中,第422行是
fileField.setStringValue(…
这似乎与我对非Groovy模拟的预期相反。有人能解释我错了什么,是否有解决方案吗
注意:Lucene 6中的文本字段是…您可以从中链接到超类
字段,并看到setStringValue
是(非-code>最终的)public void
事实上,您已经基本上提出了相同的问题,并且您已经接受了!您需要使用一个globalGroovy mock:
package de.scrum\u master.stackoverflow
导入org.apache.lucene.document.TextField
导入org.apache.lucene.index.IndexWriter
导入org.apache.lucene.index.IndexableField
类Lucene引擎{
文本字段文本字段
文本字段文件字段
索引写入器索引写入器
字符串当前文件名
Iterable事实上,您已经基本上提出了相同的问题,甚至已经接受了!您需要使用一个全局Groovy模拟:
package de.scrum\u master.stackoverflow
导入org.apache.lucene.document.TextField
导入org.apache.lucene.index.IndexWriter
导入org.apache.lucene.index.IndexableField
类Lucene引擎{
文本字段文本字段
文本字段文件字段
索引写入器索引写入器
字符串当前文件名
IterableIt使您的代码片段可运行总是很乏味的。为什么不提供完整的应用程序和测试类以及包名和导入?我已经在做了,但我记得您前面的问题也很乏味。我不喜欢做您的工作,创建一个复制您的问题。您有2.6k的声誉,应该知道tter。仅仅在我的大脑中解析你的代码是不够的,我需要运行它。很抱歉……但你没有义务回答问题,更不用说制作MCVE了。你可以留下一张便条说,如果你制作MCVE,你会看到一些东西。我只是想有人可能会看到我的代码并说:“啊哈,那东西错了"…当然,我是自愿帮助这里的人的。不过,这里的MCVE帖子解释了它的价值,作者应该提供一个,以便让其他人更容易回答这个问题。我想帮助,所以我做了这项工作。这并不意味着我喜欢它。请随意搜索我已经从海报上请求了多少次MCVE。M他们中的大多数人甚至从不回答。许多人问后续问题,甚至试图在评论中发布示例代码(不可读)但他们仍然懒得创建MCVE。就个人而言,我非常感谢您和其他专家所做的努力,而且我个人不会忽略创建MCVE的请求:我确实认为这是不礼貌的。让代码片段可以运行总是很乏味的。为什么不提供完整的应用程序和测试类,并提供包名和导入?我已经在做了,但我记得你之前的问题也很无聊。我不喜欢做你的工作,创建一个复制你的问题。你有2.6k的声誉,应该更清楚。仅仅在我的大脑中解析你的代码是不够的,我需要运行它。很抱歉……但你没有义务回答一个问题,更不用说做一个MCVE了。你可以留下一张便条,上面写着如果你做一个MCVE,你会看到一些东西。我只是想有人可以看看我的代码,然后说:“啊哈,那东西错了。”…当然,我是自愿帮助这里的人的。不过,这里的MCVE帖子解释了它的价值,作者应该提供一个,以便让其他人更容易回答这个问题。我想帮助,所以我做了这项工作。这并不意味着我喜欢它。请随意搜索我已经从海报上请求了多少次MCVE。M他们中的大多数人甚至从不回答。许多人问后续问题,甚至试图在评论中发布示例代码(不可读)但他们仍然懒得创建MCVE。就个人而言,我非常感谢您和其他专家所做的努力,而且我个人不会忽视做出MCVE的请求:我真的认为这是不礼貌的。感谢您的回答……但在这里发布之前,我确实尝试过GroovyMock,有没有global:true。显然我已经尝试过了做了一些不好的事情。我完全忘记了前面的问题,在我发帖前的研究中没有提到这个问题:我试图自学斯波克(和Groovy)这是一个相当陡峭的学习曲线。我打算删除这个问题。你不必回答任何问题,尤其是如果你意识到这是一个骗局的话。很抱歉我犯了这个错误。我希望你不要在我费心重新创建你的情况,写一个答案,甚至在斯波克邮件列表上为你发帖后删除它。这不是一个错误完全是欺骗,只有相同的根本原因。在你之前的帖子中,你在自己的回答中声称它在没有全局模拟的情况下对你有效,我认为这是错误的。是的,这就是为什么我在删除之前犹豫的原因。再次感谢你的巨大帮助:非常感谢。感谢你的回答……但在这里发布之前,我实际上已经尝试过GroovyMock,带和不带全局:tr