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