2016-09-08 7 views
1

データベースのデータを検証し、それに応じてアサートするマルチスレッドコードを作成しました。しかし、アサーションはこの環境では機能しません。スレッドコード内のアサーションはテストケースに失敗しません

スレッド

Runnable r = new WorkerThread(subasscociation); 
new Thread(r).start(); 
new Thread(r).start(); 

スレッド開始関数のコードが

public class WorkerThread implements Runnable { 

    ArrayList<Association> alInsertedAssociations; 
    public WorkerThread(ArrayList<Association> alInsertedAssociations) { 
     this.alInsertedAssociations = alInsertedAssociations; 
    } 

    public void run() { 
     SecondLevelVerification slv = new SecondLevelVerification(); 
     slv.verify(alInsertedAssociations,"add", false); 
    } 
} 

public void verify(...) 
{ 
    //Code to check database 
org.testng.Assert.assertNotEquals(label, 0); 
} 

を主張する。しかし、コード、すなわちを動作するようには思えない機能であるを作成するためのコードデータベースにそのエントリがない場合は正しくアサートされません。

+0

マルチスレッド部品とは何ですか?テストしているコードが見えない場合は、テストが失敗している理由を説明することはできません。 – byxor

+0

マルチスレッド部分は検証機能です。この関数は、arraylistから読み込み、エントリがデータベースで利用可能かどうかをチェックします。私は配列リストを分割してスレッドを作成しています。 –

+0

デバッガを試しましたか? –

答えて

2

アサーションは例外をスローすることで動作しますが、テストフレームワークによってインストールされたハンドラには到達しません。後者は、テストが開始されたスレッドのみを監視しますが、例外はテスト内から作成された別のスレッドからスローされます。詳細については、これらの質問を参照してください。

受け入れ答えはそこにあなたの問題を解決する方法を提案します。

class MyThread extends Thread implements Thread.UncaughtExceptionHandler { 
    Throwable interceptedException = null; 

    MyThread(Runnable r) { 
     super(r); 
     this.setUncaughtExceptionHandler(this); 
    } 
    @Override 
    public void uncaughtException(Thread t, Throwable ex) { 
     interceptedException = ex; 
    } 

    public void myjoin() throws Throwable { 
     super.join(); 
     if (interceptedException != null) 
      throw interceptedException; 
    } 
} 

あなたのテストコードにMyThread代わりのThreadを使用してmyjoin()メソッドを呼び出す必要があります:

ここではテストフレームワークにあなたのスレッド内部で発生する例外を伝播することができますクラスのドラフト版です
Runnable r = new WorkerThread(subasscociation); 
final myThread1 = new MyThread(r); 
final myThread2 = new MyThread(r); 

myThread1.start(); 
myThread2.start(); 

... 

myThread1.myjoin(); 
myThread2.myjoin(); 
関連する問題