我编写了一个多线程代码,它将验证数据库中的数据并相应地断言。但这些断言并不适用于这种环境。
创建线程的代码
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 :(得分: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();