Java:Can';t在测试用例上实现runnable:void run()冲突

Java:Can';t在测试用例上实现runnable:void run()冲突,java,junit,selenium,Java,Junit,Selenium,所以我有一个测试用例,我想把它做成一个线程。我不能扩展线程,也不能实现runnable,因为TestCase已经有一个方法void run()。我得到的编译错误是错误(62,17):com.util.SeleneseTestCase类中的方法run()无法用不同的返回类型覆盖junit.framework.TestCase类中的方法run(),它是类junit.framework.TestResult 我试图做的是扩展Selenium测试用例以执行压力测试。目前我无法使用selenium gri

所以我有一个测试用例,我想把它做成一个线程。我不能扩展线程,也不能实现runnable,因为TestCase已经有一个方法void run()。我得到的编译错误是
错误(62,17):com.util.SeleneseTestCase类中的方法run()无法用不同的返回类型覆盖junit.framework.TestCase类中的方法run(),它是类junit.framework.TestResult

我试图做的是扩展Selenium测试用例以执行压力测试。目前我无法使用selenium grid/pushtotest.com/amazon cloud(安装问题/安装时间/资源问题)。所以这对我来说更像是一个Java语言问题


仅供参考:SeleniumTestCase是我想要制作的多线程测试用例,用于压力测试。SelniumTestCase扩展了TestCase(来自junit)。我正在扩展SeleniumTestCase并试图使其实现Runnable。

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

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

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();
    }
}
更新以在TestCase类之外使用

要从另一个类运行内部类,需要将其公开,然后从外部类执行以下操作:

YourTestCase testCase = new YourTestCase();
YourTestCase.MyRunnable r = testCase.new MyRunnable();
但是,如果您不需要从测试用例内部调用它,那么最好使用普通类,将MyRunnable设置为公共类而不在测试用例中


希望能有所帮助。

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

请记住,如果线程抛出任何异常,测试不一定会失败。您可能希望使用
ExecutorService.submit(Callable)
,而不是使用
Runnable
Thread

公共类SeleneseTestCase扩展了SeleniumTestCase{
私有类服务器实现了可调用{
公开作废通知(){
//你在这里工作吗
返回null;
}
}
public void testUnderLoad()引发异常{
ExecutorService ExecutorService=Executors.newFixedThreadPool(
兼职工人人数);
列出压力源=新建ArrayList();
对于(int i=0;i

注意:如果您想让工作人员返回结果,可以将
StressServer
的类型更改为
Callable

这不会编译,因为无法在SeleneTestCase内部定义
void run()
。只需删除void run()从您的TestCase中,使用SeleneseTestCase中的适当方法,但您可以保留调用MyRunnable的实现。我不知道Selenium我不知道您应该重写哪个方法,但这就是想法。嗯,我似乎无法在该类之外实例化Runnable内部类,这就是我正在尝试的。例如,`新线程(YourTestCase.MyRunnable.class.newInstance()).start();`导致实例化异常。编辑以显示如何从任何其他类实例化内部类。Extends Thread类也不是正确的OO模型,除非您为线程添加不常见的特定行为。当我们希望在另一个ThreadHeh中执行操作时,Implements Runnable是最佳选项。我最终确实这样做了。
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();
  }
}