junit утверждают в потоке, выдает исключение

Что я делаю неправильно, что исключение выдается вместо того, чтобы показать отказ, или разве у меня не должно быть утверждений в потоках?

 @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)
21
задан antony.trupe 8 April 2010 в 15:04
поделиться

1 ответ

Платформа 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 () для проверки. При необходимости метод тестирования будет ждать и выдаст ошибку утверждения в контексте основного потока.

34
ответ дан 29 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: