2016-07-06 15 views
0

私は意図的にcatインスタンスを失敗させています。次のテストに合格します。統合テスト中にdomain.save(failOnError:true)が失敗する

void testSomething() {        

     Cat.metaClass.save = { 

      throw new Exception("Asdasd") 
     } 

     shouldFail(Exception){ 

      Cat cat = new Cat(name: "asd") 
      cat.save() 

     } 


     GroovySystem.metaClassRegistry.removeMetaClass(Cat.class) 


    } 

ただし、saveメソッドのfailOnErrorプロパティを設定すると、これは失敗します。 save(failOnError:true)が例外をスローするように、metaClassを使用して保存を変更するにはどうすればよいですか?私は助けていただきありがとうございます!ありがとう!

void testSomething() {        

     Cat.metaClass.save = { 

      throw new Exception("Asdasd") 
     } 

     shouldFail(Exception){ 

      Cat cat = new Cat(name: "asd") 
      cat.save(failOnError: true) 

     } 


     GroovySystem.metaClassRegistry.removeMetaClass(Cat.class) 


    } 

ため、いくつかのケースでは、ドメインのインスタンスが「doesnの同じテストを行うことへの1つの代替は、検証が失敗し、例外がスローされるように、ドメインインスタンスに無効なパラメータを渡すことですが、これはすべてのケースでは動作しませんユーザーが指定したパラメータが必要です。したがって、この場合、ドメインsave()の失敗をシミュレートするために、保存の失敗を模擬する方法が必要になります。 save(flush:true)、save(failOnError:true)のようなsave paramsの有無にかかわらず、どのようにモックを保存するかの答えを誰かが持っていると感謝します。ありがとう!

答えて

1

save()のmetaClassingの最初のインスタンスは正常です。

save(failOnError:true)バージョンをmetaClassしようとすると、実際の採用されたメソッドのシグネチャに一致するようにmetaClassingステートメントを変更する必要があります。 "save()"呼び出しは、 "save(failOnError:true)"呼び出しと同じではありません。これを試してみてください(パラメータが厳密に入力されていると思われますので、マップを使用しています):

Cat.metaClass.save = { Map map -> 
    throw new Exception("failOnError is true") 
} 
関連する問題