【问题标题】:How to unit test that a new InputStream was used during a retry?如何对重试期间使用新的 InputStream 进行单元测试?
【发布时间】:2021-07-17 03:20:59
【问题描述】:

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

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

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

其中 InputStreamProvider 是一个功能接口,用于在重试的情况下提供全新的输入流,看起来像这样:

public interface InputStreamProvider {
InputStream getInputStream();
}

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

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

【问题讨论】:

  • 如果您在测试数据流时需要帮助,仅仅接口是不够的。您需要发布要测试的代码。

标签: java junit inputstream retry-logic


【解决方案1】:

你问错问题了。

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

读取流并验证输出,即内容。您不关心或测试流是如何实现的,只关心流是否执行 根据 API 协定。

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

【讨论】:

    猜你喜欢
    • 2015-05-11
    • 1970-01-01
    • 2012-01-08
    • 2017-01-08
    • 2012-07-10
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多