Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java单元测试执行器服务_Java_Multithreading_Unit Testing - Fatal编程技术网

java单元测试执行器服务

java单元测试执行器服务,java,multithreading,unit-testing,Java,Multithreading,Unit Testing,我很难找到一种方法来对一些使用多线程的代码进行单元测试。下面是给我带来问题的代码: public class ThreadHandler { private ExecutorService executorService; private boolean isFinished = false; public void start() { isFinished = false; executorService = Executors.newFixedThreadPoo

我很难找到一种方法来对一些使用多线程的代码进行单元测试。下面是给我带来问题的代码:

public class ThreadHandler {
  private ExecutorService executorService;
  private boolean isFinished = false;

  public void start() {
    isFinished = false;
    executorService = Executors.newFixedThreadPool(10);
  }

  public void stop() {
    isFinished = true;
    executorService.shutdown();
  }

  public void listen(final ServerSocket serverSocket) throws IOException {
    Runnable runnable = new Runnable() {
      @Override
      public void run() {
        Socket socket = null;
        try {
          while (!isFinished) {
            socket = serverSocket.accept();
            executorService.submit(new ClassIWantToMockOut(socket));
          }
        } catch (IOException e) {
          ...
        } finally {
          try {
            socket.close();
          } catch(IOException e) {
            ...
          }
        }
      }
    };

    this.createThread(runnable);
  }

  public void createThread(Runnable runnable) {
    Thread serverThread = new Thread(runnable);
    serverThread.start();
  }
}
我想通过模拟ClassIWantToMockOut(套接字)来测试listen方法。不过,就我所知,模拟类构造函数是不可能的。我能做些什么来让这段代码更加单元测试友好吗?

这就是工厂的目的。定义一个工厂,用于创建新的
ClassiWantMockout
实例

public class CIWTMOFactory {
    ClassIWantToMockOut newInstance(ServerSocket serverSocket) {
        return new ClassIWantToMockOut(serverSocket);
    }
}
然后给你的
ThreadHandler
class 2构造函数。一个接受工厂对象作为参数,另一个使用默认工厂

class ThreadHandler {
    private static final CIWTMOFactory defaultFactory = new CIWTMOFactory();
    private final CIWTMOFactory ciwtmoFactory;

    public ThreadHandler() {
        ciwtmoFactory = defaultFactory;
        ...
    }

    public ThreadHandler(CIWTMOFactory ciwtmoFactory) {
        this.ciwtmoFactory = ciwtmoFactory;
        ...
    }

    public void listen(...) throws ... {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                ...
                executorService.submit(ciwtmoFactory.newInstance(socket));
                ...
            };
        ...
    }
...
}
现在,您的单元测试可以通过返回mock
classiswanttomockout
对象的工厂


工厂模式是一种更一般的模式的特例,我不知道它的名称。问题是,您想要单元测试类
C
,它从包
P
中调用一组
静态方法。解决方案是,您定义一个新类,
PAdapter
,其中包含许多实例方法,每个实例方法只从包P中调用一个具有相同名称和参数的静态方法


在您重新编写类
C
以通过一个
PAdapter
实例进行所有“静态”方法调用之后,您将能够为
C
编写单元测试,该测试通过一个mock/stub/fake/whatever
PAdapter
实例。

“下面是给我带来问题的代码:”,什么问题?