【发布时间】: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