Что я делаю неправильно, что исключение выдается вместо того, чтобы показать отказ, или разве у меня не должно быть утверждений в потоках?
@Test
public void testComplex() throws InterruptedException {
int loops = 10;
for (int i = 0; i < loops; i++) {
final int j = i;
new Thread() {
@Override
public void run() {
ApiProxy.setEnvironmentForCurrentThread(env);//ignore this
new CounterFactory().getCounter("test").increment();//ignore this too
int count2 = new CounterFactory().getCounter("test").getCount();//ignore
assertEquals(j, count2);//here be exceptions thrown. this is line 75
}
}.start();
}
Thread.sleep(5 * 1000);
assertEquals(loops, new CounterFactory().getCounter("test").getCount());
}
StackTrace
Exception in thread "Thread-26" junit.framework.AssertionFailedError: expected:<5> but was:<6>
at junit.framework.Assert.fail(Assert.java:47)
at junit.framework.Assert.failNotEquals(Assert.java:277)
at junit.framework.Assert.assertEquals(Assert.java:64)
at junit.framework.Assert.assertEquals(Assert.java:195)
at junit.framework.Assert.assertEquals(Assert.java:201)
at com.bitdual.server.dao.ShardedCounterTest$3.run(ShardedCounterTest.java:77)
Платформа JUnit фиксирует только ошибки утверждения в основном потоке, выполняющем тест. Ему не известны исключения из новых потоков порождения. Чтобы сделать это правильно, вы должны сообщить о состоянии завершения потока основному потоку. Вы должны правильно синхронизировать потоки и использовать какую-то общую переменную, чтобы указать результат вложенного потока.
РЕДАКТИРОВАТЬ:
Вот общее решение, которое может помочь:
class AsynchTester{
private Thread thread;
private AssertionError exc;
public AsynchTester(final Runnable runnable){
thread = new Thread(new Runnable(){
public void run(){
try{
runnable.run();
}catch(AssertionError e){
exc = e;
}
}
});
}
public void start(){
thread.start();
}
public void test() throws InterruptedException{
thread.join();
if (exc != null)
throw exc;
}
}
Вы должны передать ему runnable в конструктор, а затем просто вызвать start () для активации и test () для проверки. При необходимости метод тестирования будет ждать и выдаст ошибку утверждения в контексте основного потока.