Java:无法在测试用例上实现runnable:void run()collides

时间:2010-05-17 17:56:23

标签: java junit selenium

所以我有一个测试用例,我想把它变成一个线程。我无法扩展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测试用例扩展到压力测试。我目前无法使用selenium grid / pushtotest.com / amazon云(安装问题/安装时间/资源问题)。所以这对我来说更像是一个Java语言问题。

FYI: SeleniumTestCase是我想要多线程扩展以进行压力测试的。 SelniumTestCase扩展了TestCase(来自junit)。我正在扩展SeleniumTestCase并尝试使其实现Runnable。

4 个答案:

答案 0 :(得分:6)

创建一个实现Runnable的内部类,并在com.util.SeleneseTestCase run()方法中从一个新的Thread调用它。像这样:

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中。

希望它有所帮助。

答案 1 :(得分:4)

在这种情况下,您没有其他选项:您必须委托给另一个对象而不是继承。

答案 2 :(得分:1)

请记住,如果线程抛出任何异常,则测试不一定会失败。您可能希望使用Runnable而不是ThreadExecutorService.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>

答案 3 :(得分:0)

无论如何,扩展TestCase几乎肯定不是正确的OO模型。模型与“有一个”不是“是一个”。也就是说,创建一个扩展线程的新类,并在测试方法中使用该类的实例。