Spring Boot 仅在单元测试中返回错误的状态代码

2023-11-25

我正在使用 Spring Boot 开发 REST API。

我有一个控制器来创建一个新用户,当创建用户时它会响应 201 (CREATED)。响应没有正文内容。

使用 Postman 或任何浏览器,我收到 201 响应。 但是当我尝试使用单元测试(Mockito)时,响应是 200。

这是我的代码:

控制器:

public CompletableFuture<ResponseEntity<Void>> registerNewUser(
    @RequestBody @Valid RegisterUserDto newUser
) throws ExecutionException, InterruptedException {

  // user service return a completable future void 
  return userService.registerNewUser(newUser).thenApply(u -> new ResponseEntity<>(u, HttpStatus.CREATED));
}

当注册过程完成时,用户服务返回一个可完成的未来无效。

@Async
CompletableFuture<Void> registerNewUser(NewUserDto newUserDto) throws ExecutionException, InterruptedException;

然后,在我的单元测试中,我有以下代码:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class UsersControllerTest {

  @Autowired
  private MockMvc mvc;

  @Mock
  private UsersService userService;

  @InjectMocks
  private UsersControllers usersController;

  @Before
  public void init() {
    MockitoAnnotations.initMocks(this);
    this.mvc = MockMvcBuilders.standaloneSetup(usersController).build();
  }

  @Test
  public void mustCreateANewUser() throws Exception {
    NewUserDto userMock = new NewUserDto("firstname", "lastname", "login", "password");

    when(userService.registerNewUser(any(NewUserDto.class)))
      .thenReturn(CompletableFuture.completedFuture(null));

    mvc.perform(post("/api/users/new")
                    .content(TestHelpers.convertToJson(userMock))
                    .contentType(TestHelpers.getJsonMediaType()))
        .andExpect(status().isCreated());
  }
}

TestHelpers.convertToJson 和 TestHelpers.getJsonMediaType 是静态方法。

public static MediaType getJsonMediaType() {
  return new MediaType(MediaType.APPLICATION_JSON.getType(),
                       MediaType.APPLICATION_JSON.getSubtype(),
                       Charset.forName("utf8"));
}

public static String convertToJson(Object o) throws IOException {
  ObjectMapper mapper = new ObjectMapper();
  return mapper.writeValueAsString(o);
}

我不明白为什么单元测试的响应代码是 200。在我的控制器、服务或控制器建议的任何部分中,我都会收到响应 200 OK。


问题是因为我的控制器和服务是异步的,所以我的单元测试它不等待正确的响应。

将我的单元测试更改为:

MvcResult result = mvc.perform(post("/api/users/new")
  .content(TestHelpers.convertToJson(registroMock))
  .contentType(TestHelpers.getJsonMediaType()))
  .andReturn();

mvc.perform(asyncDispatch(result))
   .andExpect(status().isCreated());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 仅在单元测试中返回错误的状态代码 的相关文章

随机推荐

  • 从 Subversion 部署网站

    我是 subversion 的新手 想知道如何从开发转向暂存 然后生产 我想我掌握了为发布创建分支的概念详细信息在这里 但我如何实际部署分支呢 理想情况下 我可以建立一个新网站并从分支复制文件 但我担心将任何 svn 绑定复制到生产环境中
  • 在 PHP 中解析转义的 JSON

    我是 PHP 世界的新手 在 PHP 中解析 JSON 时遇到问题 我想使用我的 Java 客户端将数据 POST 到 PHP 脚本Apache HttpClient 4 x and Gson My JSON Knt KntWatchId
  • 合并两个数组并使用 jquery 创建第三个数组

    我有 2 个数组arr1 A B C D 和 arr2 a b c d 我想通过以下方式组合这两个数组来创建第三个数组 arr3 A a B b C c D d 我怎样才能使用 jquery 实现这一点 请帮忙 尝试使用jquery的 me
  • 如何在Delphi中编写一个EXE,它也是一个COM服务器

    我有一个 Delphi 2007 应用程序 它只是一个标准的 exe 我想向它添加一个 COM 接口 我已经有一个 COM dll 它导出多个 COM 对象 并且运行良好 然而 当我尝试将 dll 中的 COM 逻辑 即 exports 和
  • C/C++/Java 中 volatile 说明符的用法

    在浏览有关多线程编程的许多资源时 通常会出现对易失性说明符的引用 很明显 至少在 C C 和 Java 版本 1 4 及更早版本 中 使用此关键字不是实现多线程之间同步的可靠方法 以下是维基百科列出的 没有解释如何 作为此说明符的典型用法
  • 在 $.ajax 成功中迭代 JSON

    当用户单击按钮时 我想返回一些数据并迭代 JSON 以便可以将结果附加到表行 此时我只是想让我的循环工作 这是我的代码 我的 JSON 返回如下 COLUMNS username password DATA foo bar button c
  • 如何在指定打印机上打印Jasper Reports?

    我想要的只是打印 Jasper 报告 而无需用户选择打印机 我搜索过但没有有效的解决方案 这是我的代码的相关部分 compile to jasper String report JasperCompileManager compileRep
  • forEach 内的异步函数与 js 循环[重复]

    这个问题在这里已经有答案了 可能的重复 javascript 使用一个回调执行一堆异步方法 我已经为这个问题苦苦挣扎了好几天 但我就是想不出一种优雅的方法来处理它 问题就在这里 我正在运行 forEach 循环 我需要知道一切何时完成 由于
  • 将非常大的 int 转换为 double,在某些计算机上会损失精度

    我目前正在学习cpp中的类型间数据转换 我被教导说 对于一个非常大的整数 我们 对于某些计算机 可能会遭受损失 转换为双精度时的精度 但该声明没有提供理由 有人可以提供解释和例子吗 谢谢 假设浮点数使用 N 位存储 现在 我们假设这个浮点数
  • JPA 工作单元克隆中遇到空或零主键

    我了解到JPA并有任务创建数据库并向其中插入一些值 我想知道如何找出最近插入的对象的ID是什么 所以我找到了一种我需要使用的方法flush的方法EntityManager 不幸的是我得到了 工作单元克隆中遇到空或零主键 当我使用上述方法时出
  • 如何检查 NSNumber 中的空值

    首先我承认我的无知 在我从事项目的几个月里 我已经学到了关于 Objective C 的一切 我还发现 Objective C 似乎使我使用过的任何其他语言中的简单问题变得复杂 这非常令人沮丧 这个问题就是一个例子 在第一次运行中 我的应用
  • 在 Android Lollipop 上使用 NFC 激活设备所有者

    我正在尝试使用 NFC 在设备上设置设备所有者包 Lollipop 概述中提到了here 要部署并激活设备所有者 您必须执行 NFC 数据 当设备处于运行状态时从编程应用程序传输到设备 其未配置状态 此数据传输发送相同的信息 如托管配置中描
  • 如何从完整的文件名列表中删除文件扩展名?

    我正在使用以下命令来获取包含名为的目录中的所有文件的列表tokens import os accounts next os walk tokens 2 Output gt gt gt print accounts DS Store Amie
  • MFC 应用程序到 Unicode/MBCS 的分段转换

    我有一个大型 MFC 应用程序 我正在扩展它以允许多语言输入 目前 我需要允许用户在单个对话框的编辑框中输入 Unicode 数据 有没有办法在不为整个应用程序打开 UNICODE 或 MBCS 的情况下执行此操作 我目前只需要转换应用程序
  • 使用 myclass::operator<(myclass &other) 对 std::list 进行排序

    我有一个std list
  • Xcode 4:使用 Git 存储库提交版本在每个构建上更新 CFBundleVersion

    我将 Xcode 4 与 Git 结合使用 并希望在每次构建时增加 Info plist 中的 CFBundleVersion CFBundleVersion 键的值应更新为我对 Git 存储库所做的最后一次提交的编号 I found th
  • 从函数内部获取所有函数参数的列表

    有没有办法得到all函数内部的函数参数 match call 不返回设置了默认值但未被覆盖的参数 例如 xf lt function a b Hi c TRUE print as list match call expand dots FA
  • 公开 dll 以进行 COM 互操作

    我以为我知道如何做到这一点 但显然不知道 所以我希望得到一些帮助 我无法让我的 dll 注册 因此我无法在 VBS 或其他地方实例化它 我编写了以下示例类 选中 使程序集 COM 可见 选中 注册 COM 互操作 然后构建它 当我尝试从 V
  • 不使用媒体播放器播放视频 [Winform]

    我想像那个人一样播放视频 link 我正在开发 C Windows 窗体应用程序 不是 NXA 但我不知道怎么办 我尝试使用Microsoft DirectX AudioVideoPlayback但没有运气 这是我到目前为止所尝试的 Ope
  • Spring Boot 仅在单元测试中返回错误的状态代码

    我正在使用 Spring Boot 开发 REST API 我有一个控制器来创建一个新用户 当创建用户时它会响应 201 CREATED 响应没有正文内容 使用 Postman 或任何浏览器 我收到 201 响应 但是当我尝试使用单元测试