如何对重试期间使用了新的 InputStream 进行单元测试?

问题描述

我有几种方法可以发送 HTTP 请求以将输入流上传到 S3。如果对 S3 的请求失败,则存在重试策略以尝试在某些状态代码上再次发送请求。由于我们不能保证输入流没有从之前的请求中部分读取,所以我们必须在重试时提供一个新的输入流。

包含输入流的对象类如下所示:

public class Customrequest {
private InputStream stream;
private InputStreamProvider inputStreamProvider;
}

其中 InputStreamProvider 是一个功能接口,用于在重试的情况下提供全新的输入流,如下所示:

public interface InputStreamProvider {
InputStream getInputStream();
}

每个 Customrequest 可以有一个 InputStream,这意味着我们不支持重试,也可以有一个 InputStreamProvider,我们支持重试。

我的问题是如何进行单元测试以确保在使用 InputStreamProvider.getInputStream() 重试时实际上提供了新的输入流?

解决方法

你问错了问题。

我的意思是你试图测试错误的东西。输入流是否被重用并不重要,重要的是输入流是否提供了正确的数据。 就是您需要测试的内容。

读取流并验证输出,即内容。您不关心或测试流的实现方式,只关心流是否根据 API 契约操作

您似乎担心测试是对一个流的操作不会影响另一个流返回的数据。所以测试一下。获取一个流,阅读其中的一些内容并验证内容。获取另一个流,从中读取不同的数量并验证内容。从第一个流中读取更多内容,然后从第二个流中读取。保持多路复用并简单地验证一个流的读取不会影响另一个流返回的数据。