我已经编写了以下代码,mockmvc.sperform不会捕获异常,而是返回一个错误堆栈。我使用调试器来确认控制器抛出了正确的错误。我是SpringBoot的新手,不明白为什么测试控制器没有处理异常。下面是我的测试控制器,它对外部服务进行了三次Api调用。控制器返回异常,但Mockmvc.perform未能断言。
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = { Application.class, ApplicationTest.class })
@AutoConfigureMockMvc
@ContextConfiguration(initializers = {WireMockInitializer.class})
public class myControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Autowired private WireMockServer wireMockServer;
@Autowired
private myController myController;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.standaloneSetup(myController)
.build();
}
@Test
@DisplayName("Should Return Execution Error")
public void shouldReturnExecutionErrorOnService() throws Exception {
// Making Three Api calls the controller internally invokes them
configureStubA(HttpStatus.INTERNAL_SERVER_ERROR, args, "invalidResponse.json");
configureStubB(HttpStatus.INTERNAL_SERVER_ERROR, args, args2, args3,
"invalidResponse.json");
configureStubC(HttpStatus.INTERNAL_SERVER_ERROR, args, "invalidResponse.json");
mockMvc
.perform(
get("/something")
.param("a", a)
.param("b", b)
.param("c", c)
.param("d", d)
.param("e", e.toArray(new String[] {})))
.andDo(print())
.andExpect(status().is5xxServerError())
.andExpect(result -> assertTrue(result.getResolvedException() instanceof
IllegalStateException));
}}
API本身永远不会返回异常。想象一下,当你调用API时,你总是会得到响应,对吧?
Spring控制器处理异常的方式是,它有一个默认的异常处理程序,它将把从控制器抛出的任何异常转换为响应对象,然后将其转换为json/xml并返回给您。
获得预期结果的一种方法是声明自己的异常,用@ResponseStatus对其进行注释,并向其传递您希望将异常映射到的http状态代码。
例如(我在下面的片段中使用Kotlin(,您可以通过以下方式声明http状态代码500和异常之间的映射:
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
class MyException(message: String) : RuntimeException(message)
然后,在测试中,您将能够像在代码片段中那样断言内部错误。
mockMvc.perform(get("/foo")).andExpect(status().isInternalServerError)
有关更多详细信息,请查看此处和此处的