루프에서 생성 된 새 파일을 모의하려고합니다. 간단한 예 :Groovy 조롱 파일 생성자가 새로 생성 된 파일에 쓰기 확인.
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
그래서, 내가 끝내 GDK (그루비 JDK)으로 확장, 이해하고, 추가 (아주 도움) 메소드가 같은 파일이있다. 하지만 Groovy는 java.io.File을 모의하려고합니다.
는 그리고 오류의 논리 다음, 나는 실제로이 같은 파일 생성자 ovveride하기로 결정
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(_)
}
}
을 그리고 생성자가 이미 존재한다는 경고를 (내가 결국 그것을 ovveride 어차피 추측) recived :
따라서 아이디어 중 하나는 사실 루프에서 새 파일 객체를 생성하는 파일 팩토리를 조롱하는 것입니다. 그러나 공장은 최소한의 쓸데없는 말로 파일 생성을 테스트하는 능력을 갖기 위해서만 사용됩니다.
그래서 PowerMock은 어떻게 작동합니까? (PowerMockRunner로드 불가), 모의 실험 방법, 추가 라이브러리 사용 안 함, 쓸모없는 클래스로 끝나지 않으십니까?
감사합니다.
'java.io.File'은 GDK에 의해 확장되지 않고 단지'metaClass'에 추가 된 유틸리티 함수를 가지고 있습니다 –