在 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 验证一个方法被调用了多少次。如果它在分块后并行 运行,那么该方法将被调用多次,等于它要处理的块数。