如何对重试期间使用新的 InputStream 进行单元测试?
How to unit test that a new InputStream was used during a retry?
我有几种发送 HTTP 请求以将输入流上传到 S3 的方法。如果对 S3 的请求失败,则有重试策略尝试在某些状态代码上再次发送请求。由于我们不能保证输入流没有从之前的请求中被部分读取,所以我们必须在重试时提供一个新的输入流。
包含输入流的对象 class 看起来像这样:
public class CustomRequest {
private InputStream stream;
private InputStreamProvider inputStreamProvider;
}
其中 InputStreamProvider 是一个功能接口,创建目的是为了在重试的情况下提供全新的输入流,看起来像这样:
public interface InputStreamProvider {
InputStream getInputStream();
}
每个 CustomRequest 可以有一个 InputStream(这意味着我们不支持重试)或一个 InputStreamProvider(我们支持重试)。
我的问题是如何进行单元测试以确保在使用 InputStreamProvider.getInputStream() 重试时我确实提供了新的输入流?
你问错问题了。
我的意思是您试图测试错误的东西。输入流是否被重用并不重要,重要的只是输入流是否提供了正确的数据。 那个就是你需要测试的。
读取流并验证输出,即内容。您不关心或测试流是如何实现的,只关心流是否 acts 根据 API 约定。
您似乎担心测试的是对一个流的操作不会影响另一个流返回的数据。所以测试一下。获取流,阅读其中的一些内容并验证内容。获取另一个流,从中读取不同的数量并验证内容。从第一个流中阅读更多内容,然后从第二个流中阅读更多内容。保持多路复用并简单地验证一个流的读取不会影响另一个流返回的数据。
我有几种发送 HTTP 请求以将输入流上传到 S3 的方法。如果对 S3 的请求失败,则有重试策略尝试在某些状态代码上再次发送请求。由于我们不能保证输入流没有从之前的请求中被部分读取,所以我们必须在重试时提供一个新的输入流。
包含输入流的对象 class 看起来像这样:
public class CustomRequest {
private InputStream stream;
private InputStreamProvider inputStreamProvider;
}
其中 InputStreamProvider 是一个功能接口,创建目的是为了在重试的情况下提供全新的输入流,看起来像这样:
public interface InputStreamProvider {
InputStream getInputStream();
}
每个 CustomRequest 可以有一个 InputStream(这意味着我们不支持重试)或一个 InputStreamProvider(我们支持重试)。
我的问题是如何进行单元测试以确保在使用 InputStreamProvider.getInputStream() 重试时我确实提供了新的输入流?
你问错问题了。
我的意思是您试图测试错误的东西。输入流是否被重用并不重要,重要的只是输入流是否提供了正确的数据。 那个就是你需要测试的。
读取流并验证输出,即内容。您不关心或测试流是如何实现的,只关心流是否 acts 根据 API 约定。
您似乎担心测试的是对一个流的操作不会影响另一个流返回的数据。所以测试一下。获取流,阅读其中的一些内容并验证内容。获取另一个流,从中读取不同的数量并验证内容。从第一个流中阅读更多内容,然后从第二个流中阅读更多内容。保持多路复用并简单地验证一个流的读取不会影响另一个流返回的数据。