线程代码中的断言不会使测试用例失败

时间:2016-09-08 09:54:05

标签: java multithreading testng

我编写了一个多线程代码,它将验证数据库中的数据并相应地断言。但这些断言并不适用于这种环境。

创建线程的代码

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);
}

但代码似乎不起作用,即如果数据库没有该条目,它就不会正确断言。

1 个答案:

答案 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();