2

クラスをクリーンアップしようとすると問題が発生します。

void testFileExists() {

  FileObject file = EasyMock.createMock(FileObject.class)

  VfsFileSystemManager.metaClass.getFile = {String s, String a ->return file}

  FileObject.metaClass.exists = {-> return true}

  assertEquals true, siteManagerHelper.fileExists(STRING, STRING)

}

void testFileNotExists() {

  FileObject file = EasyMock.createMock(FileObject.class)

  VfsFileSystemManager.metaClass.getFile = {String s, String a ->return file}

  FileObject.metaClass.exists = {-> return false}

  assertEquals false, siteManagerHelper.fileExists(STRING, STRING)

}

一度に 1 つ実行すると正常に動作しますが、両方を同時に実行すると、exists() は常に true を返します (最初の .metaclass を false に変更すると、false が返されます)。したがって、メタクラスを解体していないと思います。

このクラスは GroovyTestCase を拡張しており、以下を追加する必要があることを確認しました。

def remove = GroovySystem.metaClassRegistry.&removeMetaClass
remove FileObject

しかし、それは機能していません。

助けてください!

編集:

私はgrails 1.3.7とgroovy 1.6.8を使用しています

private boolean fileExists(String path, String file){

    if(path != null && path != ""){

     FileObject fileToCheck = fsManager.getFile(path, file)

     boolean fileExists = fileToCheck.exists()

     logger.debug "File exists? ${fileExists}"

     return fileExists
    }

    logger.debug "The path is null or empty"

    return false

}
4

1 に答える 1

2

私は同様の問題(Grails 2.2.0)に直面し、以下に従ってそれを克服することができました:

  1. テストメソッドの最後に使用GroovySystem.metaClassRegistry.removeMetaClass(FileObject.class)して分解します

  2. FileObject.metaClass = nullテストクラスtearDown()で使用

なぜ両方の TeaDown を同時に使用する必要があるのか​​ 、まだ疑問に思っています。

注:- 私の場合、Java オブジェクトと比較して、Groovy オブジェクトをメタクラス化しました。

于 2013-04-11T15:40:27.603 に答える