我如何在完整的未来测试异常?

2023-12-22

我一直在将一些代码转换为异步代码。原来的单元测试使用了注解@Test(expected = MyExcpetion.class)但我认为这不会起作用,因为我想要断言的异常被包装在java.util.concurrent.ExcutionException。我确实尝试过这样称呼我的未来,但我的断言仍然失败,我不喜欢我必须添加return null

myApiCall.get(123).exceptionally((ex) -> {
 assertEquals(ex.getCause(),MyCustomException.class)
 return null
}

我也尝试过这个味道,但还是不行

myApiCall.get(123).exceptionally((ex) -> {
 assertThat(ex.getCause())
  .isInstanceOF(MyException.class)
  .hasMessage("expected message etc")
 return null;
}

如果找不到 id,我的 API 就会抛出异常。我应该如何正确测试这个?我可以使用原来的注释吗?

我的 api 调用在运行时会到达数据库。在这个测试中,我将我的 future 设置为返回错误,因此它实际上不会尝试与任何东西进行通信。被测试的代码如下所示

 public class myApiCall  { 
   public completableFuture get(final String id){
   return myService.getFromDB(id)
    .thenApply( 
       //code here looks at result and if happy path then returns it after 
       //doing some transformation 
      //otherwise it throws exception 
   )
  }
 }

在单元测试中我强制myService.getFromDB(id)返回错误数据,以便我可以测试异常,并保持单元测试不接触数据库等。


假设您的 API 在调用时会抛出异常0:

public static CompletableFuture<Integer> apiCall(int id) {
  return CompletableFuture.supplyAsync(() -> {
    if (id == 0) throw new RuntimeException("Please not 0!!");
    else return id;
  });
}

您可以使用以下代码测试它是否按预期工作(我正在使用 TestNG,但我怀疑将其转换为 JUnit 测试不会太困难):

@Test public void test_ok() throws Exception {
  CompletableFuture<Integer> result = apiCall(1);
  assertEquals(result.get(), (Integer) 1);
}

@Test(expectedExceptions = ExecutionException.class,
      expectedExceptionsMessageRegExp = ".*RuntimeException.*Please not 0!!")
public void test_ex() throws Throwable {
  CompletableFuture<Integer> result = apiCall(0);
  result.get();
}

请注意,第二个测试使用的事实是 ExecutionException 消息将包含原始异常类型和消息,并使用正则表达式捕获期望。如果你不能用 JUnit 做到这一点,你可以调用result.get()在 try/catch 块中并调用throw e.getCause();在 catch 块中。换句话说,是这样的:

@Test(expectedExceptions = RuntimeException.class,
      expectedExceptionsMessageRegExp = "Please not 0!!")
public void test_ex() throws Throwable {
  CompletableFuture<Integer> result = apiCall(0);
  try {
    result.get();
  } catch (ExecutionException e) {
    throw e.getCause();
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何在完整的未来测试异常? 的相关文章

  • 在eclipse java项目中加载dll文件

    我正在尝试添加文件sqljdbc auth dll到项目库 我将包含 dll 的文件夹添加为外部类文件夹 在这里 我基本上尝试使用 Microsoft 提供的 SQL 驱动程序连接到我的 SQL SERVER 2008 数据库 我的代码是
  • Android 相机:线程?哪个应该做什么

    我试图弄清楚哪些线程应该在 Android 中执行哪些操作 我发现官方文档中唯一说明的是camera open 应该放入它自己的线程中 关于什么 camera startPreview camera stopPreview camera r
  • 如何测试两个 Joda-Time DateTime 对象几乎相等?

    在单元测试中 我经常使用返回DateTime于或关于now 有没有办法说actual日期时间在几秒之内actual约会时间 这听起来是个坏主意 单元测试不应该以任何方式依赖于当前的实际时间 这就是为什么注入一些接口是一个很好的做法 称为Cl
  • 您最好的 Swing 设计模式和技巧是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • JavaFX 控制器如何访问其他服务?

    我将 JavaFX 2 与 Scala 一起使用 我有class Application extends javafx application Application它执行诸如读取应用程序配置等操作 然后它会启动主窗口 该主窗口需要连接到一
  • 如何防止 gson 将整数转换为双精度数

    我的 json 中有整数 但我不希望 gson 将它们转换为双精度数 以下不起作用 Test public void keepsIntsAsIs String json id 1 quantity 2 name apple id 3 qua
  • Java 中的双精度小数格式

    我在格式化双精度数的小数时遇到一些问题 如果我有双重值 例如4 0 如何格式化小数 使其变为 4 00 其中一种方法是使用数字格式 http docs oracle com javase tutorial i18n format decim
  • 如何解决Spring Data JPA中的N+1问题?

    我使用 Spring Data JPA 作为持久层 并且面临 N 1 问题 我还使用规范 API 因为我发现很难解决 N 1 问题 请帮忙 Entity public class PopulationHealth Id private in
  • 克隆在幕后是如何工作的?

    克隆不会调用对象构造函数来创建对象的副本 那么clone使用什么算法呢 我正在寻找本机方法克隆的实现细节 任何指示将不胜感激 请注意 我知道克隆的缺点 protected native Object clone 我不太清楚 我需要查看本机代
  • Jenkins 中未找到 Maven

    我正在 Jenkins 中运行我的 Maven Spring 项目 只是第一次测试它 使用 shell 脚本选项 mvn spring boot run 我收到构建错误 Users Shared Jenkins tmp jenkins808
  • 如何同时运行两个FOR循环

    我正在使用加速度计 第一个代码是振动检测器 代码1 if sensor SensorManager SENSOR ACCELEROMETER long curTime System currentTimeMillis long now Sy
  • Hibernate 时间戳 - 毫秒精度

    似乎以毫秒精度存储时间戳是休眠的一个已知问题 我在数据库中的字段最初设置为时间戳 3 但我也尝试过日期时间 3 不幸的是 它没有任何区别 我尝试过使用 Timestamp 和 Date 类 最近我开始使用 joda time 库 经过所有这
  • 全屏 Swing 组件无法在 Mac OS X Mountain Lion 上的 Java 7 上接收键盘输入

    12 21 更新 7u10 最近发布 确认 问题仍然存在 值得庆幸的是 解决方法仍然有效 11 7 更新 我们有一个解决方法 来自 Oracle 的 Leonid Romanov 在 openjdk java net 邮件列表上提供了一些关
  • 从文件夹中读取java文件

    我开发了一个应用程序 可以从用户选择的文件夹中读取文件 它显示每个文件中有多少行代码 我只想在文件选择器中显示 Java 文件 具有 java 扩展名的文件 下面是我的代码 public static void main String ar
  • 我的递归条件是否正确计算二叉树高度?

    我想在你的帮助下知道我的代码是对还是错 因为遗憾的是我无法运行它来检查 没有编译错误 我想做的是找到二叉树的高度 当然 树不必是平衡的 二叉树中的每个节点可以有两个节点作为子节点 http en wikipedia org wiki Bin
  • 从 java 反射中隐藏我的安全密钥

    下面的类是我用于加密的安全密钥提供程序 public class MySecretKey private String key 2sfdsdf7787fgrtdfg cj5 Some Util methods goes on Here 首先
  • JarSplice 的命令行参数?

    罐子接头 http ninjacave com jarsplice允许将 jar 文件以及其他依赖项和库聚合到一个可执行 jar 文件中 但是 我的可执行 jar 需要两个命令行参数 当我调用 JarSplice jar 时 这两个参数似乎
  • 从 blob 反序列化 java 对象

    首先 我很抱歉 我要问一些愚蠢的问题 我根本不懂java 也不知道我们是否可以问这样的问题 如果没有 删除我的主题 oracle中有一个存储blob的表 它是二进制的 我能够解码它 输出看起来像这样 sr com epam insure c
  • JShell 如何查找变量或结果的类型

    如何在 JShell 中查找变量或表达式结果的类型 正在尝试 Java 中的按位运算符 jshell gt byte b 5 lt lt 1 Error incompatible types possible lossy conversio
  • 客户端和服务器之间的安全连接

    我正在开发一个服务器组件 它将为嵌入式客户端的请求提供服务 这也在我的控制之下 现在一切都是测试版 安全性是这样的 客户端通过 https 发送用户名 密码 服务器返回访问令牌 客户端使用自定义标头中的访问令牌通过 http 发出进一步请求

随机推荐

  • NSString 的长度(以字节为单位)是多少?

    如何获取字节长度NSString if myString包含 你好 myString length将返回 5 但是实际占用了多少字节 NSString test ABCDEFGHIJKLMNOPQRSTUVWXYZ NSUInteger b
  • 将美元金额(小数)除以整数

    我需要为我正在构建的程序编写一个会计例程 该例程将使我能够将小数除以整数 例如 143 13 5 28 62 28 62 28 63 28 63 28 63 我在这里看过这篇文章 C 中的均分 https stackoverflow com
  • Windows 7 启动选项允许忽略未签名的驱动程序

    我正在学习 Windows 内核模式驱动程序开发 我编写了一个小型测试驱动程序 可以在 VirtualBox 中的 VM 下运行的 Windows 7 32 位 Ultima 版本下成功注册 取消注册 加载和卸载 我的主机是Windows
  • 将具有多个应用程序页面的 Chrome 扩展程序移植到 Firefox

    Chrome 我有一个 Chrome 扩展 其行为类似于 Web 应用程序 除了使用 chrome API 和跨源请求 其中包含多个 html 页面 这些页面都使用背景 html与 NPAPI 插件通信 扩展的结构 从扩展的根开始 如下 背
  • 为什么在 Grails 中使用

    如果您已经熟悉标准 HTML 表单标签 那么在 Grails 中使用 g textField 的原因是什么 如果我理解正确 以下两个标记替代方案是等效的
  • 当我声明通用“T 数组”时,如果出现内部错误,我该怎么办?

    该单元无法在 XE2 Update 3 中编译 并显示 DCC Fatal Error Test pas 22 F2084 Internal Error URW1147 unit Test interface type TSorter
  • 使用/ Python 附加到 Pandas 数据框时保留标题

    因此 我正在解析许多文件中包含的数据 循环遍历它们并将某些元素存储在列表中 然后使用 Python 将每个结果列表附加到 Pandas 的数据帧中 它有效 但我不知道如何在附加时保留标题行 它要么消失 要么随每个追加而重复 以下代码作为最新
  • Notepad ++ 中的开关字位置

    我的文字如下所示 Text1 Text2 Text3 Text4 Text5 Text6 Text7 我想像这样改变文本位置 Text1 Text4 Text5 Text6 Text2 Text3 Text7 如果可以删除 在文本 4 5
  • Eclipse 上的 Android 模拟器不工作

    我一直在遵循以下位置的说明http developer android com training basics firstapp running app html http developer android com training ba
  • WordPress 页面 ID 不是帖子 ID

    有没有办法获取当前页面的ID 该页面循环显示帖子 我需要在 header php 中获取此 ID here I added posts 这取决于您想从哪里获取此 ID 如果您尝试在已设置为显示帖子的页面 即设置为 博客 的页面 上获取它 则
  • 我是否需要 Mac 来开发 Azure Xamarin.iOS 应用程序?

    常规 Xamarin 不是 Azure 版本 显然需要运行 Mac OS X 的 Mac 计算机来开发 iOS 应用程序 但在 Microsoft Azure Xamarin iOS 文档中 任何地方都没有这样的先决条件 这是否意味着我可以
  • 如何调用dll注入中的特定函数?

    以下代码将注入 dll 并调用 DllMain 如何从 DLL 调用特定函数 而不仅仅是 DllMain DWORD pid HANDLE hd LPVOID gp rs proc gp LPVOID GetProcAddress GetM
  • unix 命令行中类似于 Matlab 的命令历史检索

    Matlab 有一个非常好的功能我很喜欢 假设我输入了命令very long command然后是几个命令 然后如果我再次需要长命令 我只需输入very然后按向上箭头键 我的长命令就会出现 它找到最后一个以very 我无法在 unix 命令
  • 失去焦点时关闭即时验证

    我使用 dojo 作为客户端框架 我有一个ValidationTextBox call txtName如下图所示 In txtName required is set required true 如果我失去焦点并离开txtName空 选项卡
  • Pandas:如何在稀疏表中选择具有非零值的列

    我有一个包含 2000 列的稀疏表 我想选择一些特定的行及其非零值 我该怎么做 id name e1 e2 e3 e4 e550 e1200 e1760 e2000 1 engine1 0 0 0 2322 1300 140 0 2 eng
  • 控制员应该与演示者交谈吗?

    In the 干净的架构 https www youtube com watch v WpkDN78P884作者 Robert Martin 假设我有这个简化版本 不显示模型 网关 边界等其他内容 现在假设我有一个View有 2 个按钮 D
  • SQL Server 中唯一标识符列的聚集/非聚集索引

    我在这里阅读了各种问题 答案 这些问题 答案基本上表明 出于性能原因 在 uniqueidentifier 列上使用聚集索引是一个糟糕的选择 无论如何 我需要使用 uniqueidentifier 作为我的主键 并且我不想使用 newseq
  • 我应该如何创建 Dockerfile 以在一个实例中运行多个服务?

    我正在尝试创建一个 Dockerfile 我是 Docker 新手 我正在创建这个 Dockerfile 它将在一个实例中启动rabbitmq ftp 服务器和elasticsearch 服务器 我创建了这样的文件 Pull base im
  • matplotlib:每个 x 轴刻度的分组误差线

    我正在尝试使用 matplotlib 绘制误差线 但要求略有不同 因此 设置如下 我有 3 种不同的方法 正在对 10 种不同的参数设置进行比较 因此 在 y 轴上 我有 3 种方法给出的模型拟合误差 在 x 轴上 我有不同的参数设置 因此
  • 我如何在完整的未来测试异常?

    我一直在将一些代码转换为异步代码 原来的单元测试使用了注解 Test expected MyExcpetion class 但我认为这不会起作用 因为我想要断言的异常被包装在java util concurrent ExcutionExce