2011-02-24 2 views
3

루프에서 생성 된 새 파일을 모의하려고합니다. 간단한 예 :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로드 불가), 모의 실험 방법, 추가 라이브러리 사용 안 함, 쓸모없는 클래스로 끝나지 않으십니까?

감사합니다.

+0

'java.io.File'은 GDK에 의해 확장되지 않고 단지'metaClass'에 추가 된 유틸리티 함수를 가지고 있습니다 –

답변

1

대안이 아닌 순수한 테스트 방법을 제안 할 수 있습니까?

이 테스트의 경우 임시 디렉토리를 만들고 테스트 대상에 basePath을 설정하고 실제로 파일을 기록하도록 허용하십시오. 당신의 주장은 분명히 결과를 확인하기 위해 파일을 읽었을 것이지만 JDK 클래스를 조롱하려고 시도하지 않고서는 완전한 테스트 일 것입니다. 테스트 해체는 임시 디렉토리를 정리할 수 있습니다.

순수 메모리 단위 테스트에서 설정 한 경우 JMockIt을 사용해야 할 수도 있습니다. 머리 글자가 있으면 문서가 JDK의 일부를 포함하여 모의 할 수 있습니다.

+0

디스크에 실제로 쓰는 것은 내가 피하려고했던 것입니다. 그리고이 예제를 실제로 테스트하려고 시도하면서 좀 더 빈번하게 사용 된 mock을 배웠습니다. JMockit은 사용 도구처럼 보입니다 (그러나 실제로는 복잡해 보입니다). 누구든지 PowerMock을 Groovy와 성공적으로 통합 할 수있었습니다 (몇 가지 구체적인 예가 발견되지 않음). – pfh

관련 문제