Java: невозможно реализовать runnable в тестовом случае: void run () сталкивается - PullRequest
3 голосов
/ 17 мая 2010

Итак, у меня есть тестовый пример, который я хочу превратить в поток. Я не могу расширить Thread и не могу реализовать runnable, поскольку в TestCase уже есть метод void run (). Я получаю ошибку компиляции Error(62,17): method run() in class com.util.SeleneseTestCase cannot override method run() in class junit.framework.TestCase with different return type, was class junit.framework.TestResult.

То, что я пытаюсь сделать, - это расширить тестовый набор Selenium для проведения стресс-тестирования. В настоящее время я не могу использовать селеновую сетку / pushtotest.com / облако Amazon (проблемы с установкой / время установки / проблемы с ресурсами). Так что для меня это больше проблема языка Java.

К вашему сведению: SeleniumTestCase - это то, что я хочу сделать многопоточным, чтобы увеличить его для стресс-тестирования. SelniumTestCase расширяет TestCase (из junit). Я расширяю SeleniumTestCase и пытаюсь заставить его реализовать Runnable.

Ответы [ 4 ]

6 голосов
/ 17 мая 2010

Создайте внутренний класс, который реализует Runnable, и вызовите его из нового потока в методе run () com.util.SeleneseTestCase. Примерно так:

class YourTestCase extends SeleneseTestCase {
    public class MyRunnable implements Runnable {
        public void run() {
            // Do your have work here
        }
    }

    public void testMethodToExecuteInThread() {
        MyRunnable r = new MyRunnable();
        Thread t = new Thread(r);
        t.start();
    }
}

Обновление для использования вне класса YourTestCase

Чтобы запустить внутренний класс из другого класса, вам нужно сделать его общедоступным, а затем из внешнего класса выполнить следующее:

YourTestCase testCase = new YourTestCase();
YourTestCase.MyRunnable r = testCase.new MyRunnable();

Но если вам не нужно вызывать его из своего тестового примера, лучше использовать обычный класс, сделайте MyRunnable общедоступным классом, не входя в YourTestCase.

Надеюсь, это поможет.

4 голосов
/ 17 мая 2010

В этом случае у вас нет другого варианта: вы должны делегировать другому объекту вместо наследования.

1 голос
/ 25 мая 2010

Имейте в виду, что если поток генерирует какие-либо исключения, проверка не обязательно будет неудачной. Вместо использования Runnable и Thread вы можете использовать ExecutorService.submit(Callable<T>):

public class SeleneseTestCase extends SeleniumTestCase {
  private class StressServer implements Callable<Void> {
    public Void call() {
      // do your work here
      return null;
    }
  }

  public void testUnderLoad() throws Exception {
    ExecutorService executorService = Executors.newFixedThreadPool(
        NUM_CONCURRENT_WORKERS);
    List<Callable<Void>> stressers = new ArrayList<Callable<Void>>();
    for (int i = 0; i < NUM_WORKERS; i++) }
      stressers.add(new StressServer());
    }
    List<Future<Void>> futures =if ( executorService.invokeAll(
        stressers, TIMEOUT_IN_SECS, TimeUnit.SECONDS);
    for (Future<Void> future : futures) {
      if (!future.isCancelled()) {
        future.get(1, TimeUnit.MILLISECONDS); // may throw exception
      }
    }
    executorService.shutdown();
  }
}

Обратите внимание: если вы хотите, чтобы работники возвращали результат, вы можете изменить тип с StressServer на Callable<YourResultType>

0 голосов
/ 17 мая 2010

расширение TestCase почти наверняка не является правильной ОО-моделью. модель с "имеет" не "является". то есть создайте новый класс, расширяющий поток, и используйте экземпляры этого класса в своих тестовых методах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...