MockMVC如何在同一个测试用例中测试异常和响应代码?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (1020)

我想断言引发了异常,并且服务器返回500内部服务器错误。

为了突出显示意图,提供了一个代码片段:

thrown.expect(NestedServletException.class);
this.mockMvc.perform(post("/account")
            .contentType(MediaType.APPLICATION_JSON)
            .content(requestString))
            .andExpect(status().isInternalServerError());

当然,如果我写作isInternalServerError或写作,这无关紧要isOk。无论是否在throw.except语句下引发异常,测试都会通过。

你将如何去解决这个问题?

提问于
用户回答回答于

在你的控制器中:

throw new Exception("Athlete with same username already exists...");

在你的测试中:

    try {
        mockMvc.perform(post("/api/athlete").contentType(contentType).
                content(TestUtil.convertObjectToJsonBytes(wAthleteFTP)))
                .andExpect(status().isInternalServerError())
                .andExpect(content().string("Athlete with same username already exists..."))
                .andDo(print());
    } catch (Exception e){
        //sink it
    }
用户回答回答于

你可以尝试下面的东西 -

  1. 创建一个自定义匹配器 public class CustomExceptionMatcher extends TypeSafeMatcher<CustomException> { private String actual; private String expected; private CustomExceptionMatcher (String expected) { this.expected = expected; } public static CustomExceptionMatcher assertSomeThing(String expected) { return new CustomExceptionMatcher (expected); } @Override protected boolean matchesSafely(CustomException exception) { actual = exception.getSomeInformation(); return actual.equals(expected); } @Override public void describeTo(Description desc) { desc.appendText("Actual =").appendValue(actual) .appendText(" Expected =").appendValue( expected); } }
  2. @Rule在JUnit类中声明如下 - @Rule public ExpectedException exception = ExpectedException.none();
  3. 在测试用例中使用自定义匹配器 - exception.expect(CustomException.class); exception.expect(CustomException .assertSomeThing("Some assertion text")); this.mockMvc.perform(post("/account") .contentType(MediaType.APPLICATION_JSON) .content(requestString)) .andExpect(status().isInternalServerError());

PS:我提供了一个通用的伪代码,你可以根据你的要求进行自定义。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励