【问题标题】:Use of Mockito given/willThrow in JUnit @Nested classes在 JUnit @Nested 类中使用 Mockito given/willThrow
【发布时间】:2021-06-16 03:28:45
【问题描述】:

我正在使用 Junit 5 和 Mockito 来测试 Spring 控制器。我的控制器使用了一个服务,在我的测试类中用 @Mockbean 注释。为了组织我的测试,我使用@Nested 类。我使用 Mockito given/willThrow 来模拟我的服务可以抛出异常的事实。然后如果服务抛出特定的异常类型,控制器会返回相应的状态码。 所以在@Nested 类中,我有例如:
@Test
@SneakyThrows
void test_404() {
    String message = "message";
        
    given(myService.doSomething(anyLong())).willThrow(new CustomExceptionOne(message));

    mockMvc.perform(get("/api/doSomething")
       .contentType("application/json;charset=UTF-8"))
       .andExpect(status().isNotFound())
       .andExpect(content().string(message))
       .andReturn();
}

在同一个类中,我有一个完整的测试套件,我在其中测试当服务抛出 CustomExceptionTwo 时,控制器返回状态 409,CustomExceptionThree 返回 412,依此类推。如果我有一个不可预测的异常,控制器会返回 500。

如果我一个一个地运行它们,所有的测试都有效。如果我运行整个套件(无论是 @Nested 类还是上层类),似乎它是第一个给定的 Mockito,它决定了其他给定的返回值。例如,如果 404 测试是第一个运行的,则所有其他测试都将失败,因为所有其他 Mockito 给出的将返回 CustomExceptionOne 而不是测试中写入的内容。

如果我将所有测试方法放在上层类而不是 @Nested 类中,则所有测试都会通过。

非常感谢您的帮助

【问题讨论】:

  • 春/春启动版?

标签: spring-mvc mockito junit5


【解决方案1】:

在我看来,您遇到了以下情况之一:

这两个问题在 2.4.x 中都标记为已解决,请考虑升级到该版本。

【讨论】:

  • 谢谢,它有效!我搜索了很多,但我认为这是一个 Mockito 问题。
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多