2017-11-13 5 views
1

データテーブルを使ったテストがあります。Spockフレームワークで、「エラー」リスナーからデータテーブル変数にアクセスするにはどうすればよいですか?

@Unroll 
"Basic session start on platform = #platform"() { 
    when: "user stats a session on a platform" 
    def response = startSession(platform, id) // it does a REST request 

    then: "response contains a userId" 
    assert verifyUserId(response.userId) // method verifies userId with an internal algorithm and returns true\false if it is valid or not 

    where: 
    id | platform 
    1 | "Facebook" 
    2 | "Google" 
    3 | "Apple" 
} 

エラーのリスナーも作成しました。

テスト実行中にアサーションエラーが発生した場合、コードはこの「エラー」メソッドに入ります。

質問は、「エラー」メソッドの中の「どこ」ブロックから変数の値を取得するのですか?

私はデータテーブル変数のアサーションを直接行っていないため、ErrorInfo.Exceptionにはそれらが含まれていません。

「ErrorInfo」オブジェクトの他の適切なメンバーも見つかりませんでした。エラーが発生したときに、ErrorInfo.getMethod()。getFeature()では変数名しか見つからず、その値も見つかりませんでした。

+3

完全なサンプル仕様を提供してください。 – Opal

+0

私はフィーチャーメソッドの完全なサンプルを提供しました - それはあなたが意味するものですか?仕様だけでクラスにラップする、それは私の場合でもセットアップ\クリーンアップを持っていません。 – Ubeogesh

+1

[It](https://github.com/Opalo/stackoverflow/tree/master/47270731)(そこに_It_ - リンクがあります)は動作しますが、それがあなたが探しているものなのか、それともスレッドセーフなのか分かりません。やってみて。 – Opal

答えて

0

ここでの主な問題は、ErrorInfoが現在のspecインスタンスを提供しないことです。そのため、反復変数を取得できないからです。だから私は、次の2つの方法をお勧めします:秒1は親切オパールのコメントで示唆された

class ListenForErrorsExtension implements IGlobalExtension { 

    void visitSpec(SpecInfo specInfo) { 
     specInfo.addListener(new Listener()) 
     specInfo.allFeatures*.addIterationInterceptor(new IMethodInterceptor() {      
      @Override 
      void intercept(IMethodInvocation invocation) { 
       holder.put(invocation.iteration.dataValues) 
       invocation.proceed() 
      } 

     }) 
    } 

まず一つは、反復インターセプターを使用することです。あなたがいないAbstractRunListenerが、IRunListener

class ErrorExtension implements IGlobalExtension{ 
.... 
    @Override 
    void beforeIteration(IterationInfo iteration) {  
     holder.put(iteration.dataValues) 
    } 
.... 
} 

をinstantinate可能性がそれはあなたが各iterrationにアクセスできますが、主なアイデアは、まだ以下の通りです:

あなたは、スレッドセーフホルダーを作成する必要があり、エラーの前にそれにiterrationデータを置きます起こってから抽出します。

+0

ありがとう!私は反復インターセプタを使用しました。ホルダーの代わりに、私はリスナーにObject変数を作成し、インターセプトメソッド内で値(dataValues)を割り当てました。その後、私はそれを「エラー」で使用しました。私が理解する限り(私は合計noob btwです)、リスナーは仕様ごとに作成されているので、私は本当にスレッドセーフなホルダーは必要ありません。私たちの場合、仕様は1スレッドで実行されます。 – Ubeogesh

+0

@Ubeogeshそれが助けてくれることを願っています:D Btwそれは常に依存しますが、通常、人々はテストスレッドをいくつかのスレッドで実行してテストの回帰時間を短縮しようとします。だから私はスレッドセーフを提案している。 –

+0

私たちはいくつかのスレッドでテストを実行しますが、それらはspecによって並列化されています(各仕様には独自のリスナー\ iterationInterceptorがあります) – Ubeogesh

関連する問題