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));
...
};
...
}
...
}
现在,您的单元测试可以通过返回mockclassiswanttomockout
对象的工厂
工厂模式是一种更一般的模式的特例,我不知道它的名称。问题是,您想要单元测试类
C
,它从包P
中调用一组静态方法。解决方案是,您定义一个新类,PAdapter
,其中包含许多实例方法,每个实例方法只从包P中调用一个具有相同名称和参数的静态方法
在您重新编写类C
以通过一个PAdapter
实例进行所有“静态”方法调用之后,您将能够为C
编写单元测试,该测试通过一个mock/stub/fake/whateverPAdapter
实例。“下面是给我带来问题的代码:”,什么问题?