在 Java 中,如何与包裹在 public 方法中的执行程序服务并行测试私有代码 运行
In Java, how to test a private code running in parallel with executor service wrapped in public method
我有一个现有的非并行代码,我们最近使用执行程序服务使其并发。在我们的场景中,添加并发确保限制发送到另一个 API 的请求数量。所以我们正在调用外部服务并限制请求,等待所有请求完成,以便稍后在发送最终响应之前合并响应。
考虑到私有方法是并行化的,我对如何向此类代码添加单元 test/mock 测试感到困惑。我在我的代码结构下面添加了解释我的情况。
我正在尝试在这里测试
@Test
public void processRequest() {
...
}
代码
int MAX_BULK_SUBREQUEST_SIZE = 10;
public void processRequest() {
...
// call to private method
ResponseList responseList = sendRequest(requestList);
}
private void sendRequest(List<..> requestList) {
List<Response> responseList = new ArrayList<>();
ExecutorService executorService = Executors.newFixedThreadPool(10);
int numOfSubRequests = requestList.size();
for (int i = 0; i < numOfSubRequests; i += MAX_BULK_SUBREQUEST_SIZE) {
List<Request> requestChunk;
if (i + MAX_BULK_SUBREQUEST_SIZE >= numOfSubRequests) {
requestChunk = requestList.subList(i, numOfSubRequests);
} else {
requestChunk = requestList.subList(i, i + MAX_BULK_SUBREQUEST_SIZE);
}
// parallelization
executorService.submit(() -> {
Response responseChunk = null;
try {
responseChunk = callService(requestChunk); // private method
} catch (XYZException e) {
...
try {
throw new Exception("Internal Server Error");
} catch (Exception ex) {
...
}
}
responseList.add(responseChunk);
});
}
executorService.shutdown();
try {
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
} catch (InterruptedException e) {..}
}
return responseList;
}
private Response callService(..) {
// call to public method1
method1(..);
// call to public method2
method2(..);
}
我能够通过单元测试来做到这一点,并添加一个 mockito 验证一个方法被调用了多少次。如果它在分块后并行 运行,那么该方法将被调用多次,等于它要处理的块数。
我有一个现有的非并行代码,我们最近使用执行程序服务使其并发。在我们的场景中,添加并发确保限制发送到另一个 API 的请求数量。所以我们正在调用外部服务并限制请求,等待所有请求完成,以便稍后在发送最终响应之前合并响应。
考虑到私有方法是并行化的,我对如何向此类代码添加单元 test/mock 测试感到困惑。我在我的代码结构下面添加了解释我的情况。
我正在尝试在这里测试
@Test
public void processRequest() {
...
}
代码
int MAX_BULK_SUBREQUEST_SIZE = 10;
public void processRequest() {
...
// call to private method
ResponseList responseList = sendRequest(requestList);
}
private void sendRequest(List<..> requestList) {
List<Response> responseList = new ArrayList<>();
ExecutorService executorService = Executors.newFixedThreadPool(10);
int numOfSubRequests = requestList.size();
for (int i = 0; i < numOfSubRequests; i += MAX_BULK_SUBREQUEST_SIZE) {
List<Request> requestChunk;
if (i + MAX_BULK_SUBREQUEST_SIZE >= numOfSubRequests) {
requestChunk = requestList.subList(i, numOfSubRequests);
} else {
requestChunk = requestList.subList(i, i + MAX_BULK_SUBREQUEST_SIZE);
}
// parallelization
executorService.submit(() -> {
Response responseChunk = null;
try {
responseChunk = callService(requestChunk); // private method
} catch (XYZException e) {
...
try {
throw new Exception("Internal Server Error");
} catch (Exception ex) {
...
}
}
responseList.add(responseChunk);
});
}
executorService.shutdown();
try {
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
} catch (InterruptedException e) {..}
}
return responseList;
}
private Response callService(..) {
// call to public method1
method1(..);
// call to public method2
method2(..);
}
我能够通过单元测试来做到这一点,并添加一个 mockito 验证一个方法被调用了多少次。如果它在分块后并行 运行,那么该方法将被调用多次,等于它要处理的块数。