gpt4 book ai didi

java - Groovy 模拟文件构造函数,验证写入新创建的文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:33 27 4
gpt4 key购买 nike

我试图模拟一个在循环中生成的新文件。简化示例:

class FileClass {

def basePath
def listObjects = []

def createFilePerObject() {
listObjects.each {currentObject ->
File currentFile = new File("${basePath.toString()}/${currentObject.objectName}")

currentFile.write currentObject.objectContent //Verify this behaviour!!
}
}

}

class SimpleObject {
String objectName
String objectContent
}

然后,测试:

class FileClassTest extends Specification {

FileClass fileClass

def "test simple object"() {

def listObjects = []

SimpleObject object1 = new SimpleObject(objectName: "First object", objectContent: "First object content")
SimpleObject object2 = new SimpleObject(objectName: "Second object", objectContent: "Second object content")
SimpleObject object3 = new SimpleObject(objectName: "Third object", objectContent: "Third object content")
SimpleObject object4 = new SimpleObject(objectName: "Fourth object", objectContent: "Fourth object content")

listObjects << object1
listObjects << object2
listObjects << object3
listObjects << object4

fileClass = new FileClass(listObjects: listObjects, basePath: ".")

def dummyFile = new MockFor(File)
def mockFile = new MockFor(File, true) //Intercept constructor call

mockFile.demand.with {
File() {dummyFile}
}

when:
mockFile.use {
fileClass.createFilePerObject()
}

then:
1 * mockFile.write(_)
}

}

因此,如您所见,我正在尝试验证新文件中是否确实写入了一些内容。

而且,我收到以下错误:

MockFor with constructor interception enabled is only allowed for Groovy objects but found: java.io.File

因此,据我所知,File 在 groovy GDK(Groovy JDK) 中进行了扩展,并且它具有额外的(并且非常有用的)方法。但是 Groovy 试图模拟 java.io.File。

并且,按照错误的逻辑,我决定像这样实际验证文件构造函数:

class FileClassTest extends Specification {

FileClass fileClass

def "test simple object"() {

def listObjects = []

SimpleObject object1 = new SimpleObject(objectName: "First object", objectContent: "First object content")
SimpleObject object2 = new SimpleObject(objectName: "Second object", objectContent: "Second object content")
SimpleObject object3 = new SimpleObject(objectName: "Third object", objectContent: "Third object content")
SimpleObject object4 = new SimpleObject(objectName: "Fourth object", objectContent: "Fourth object content")

listObjects << object1
listObjects << object2
listObjects << object3
listObjects << object4

fileClass = new FileClass(basePath: ".", listObjects: listObjects)

def mockFile = new MockFor(File)

File.metaClass.constructor << {String filePath -> mockFile } //Return the mocked file, so it can be verified

when:
mockFile.use {
fileClass.createFilePerObject()
}

then:
1 * mockFile.write(_)
}

}

并收到构造函数已经存在的警告(我想我毕竟无法验证它):

groovy.lang.GroovyRuntimeException: Cannot add new constructor for arguments [[class java.lang.String]]. It already exists!

因此,其中一个想法是实际模拟将在循环中生成新文件对象的文件工厂。但是,至少可以说,工厂是无用的 - 它只能用于测试文件创建的能力。

那么,PowerMock 不工作(无法加载 PowerMockRunner),有什么想法可以模拟这个,不使用额外的库,并且不会以无用的类结束?

谢谢。

最佳答案

我可以推荐替代的非纯测试方法吗?

为此测试创建一个临时目录,在测试主题中设置 basePath 并允许测试实际写出文件。您的断言显然已经读入了文件以验证结果,但这将是一个完整的测试,无需尝试模拟 JDK 类。然后测试拆解可以清理临时目录。

如果您真的打算进行纯内存单元测试,恐怕您可能不得不使用 JMockIt如果您能理解它并且文档可以模拟任何东西,包括 JDK 的一部分。

关于java - Groovy 模拟文件构造函数,验证写入新创建的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5104086/

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