【问题标题】:How to test the error output of a Spring Boot Controller?如何测试 Spring Boot Controller 的错误输出?
【发布时间】:2015-05-21 04:25:03
【问题描述】:

我已经实现了一个带有简单请求/响应的简单控制器。

控制器

    @RestController
@RequestMapping("/")
public class HelloWorldController extends AbstractRestController {

    @RequestMapping(value = "/hello", method = RequestMethod.POST)
    public HelloWorldResponse sayHello(@Valid @RequestBody HelloWorldRequest request) {

        String message = String.format("Hello %s!", request.getSayHelloTo());
        return new HelloWorldResponse(message);
    }

}

请求

public class HelloWorldRequest {

    @NotEmpty
    @NotNull
    private String sayHelloTo;

    protected HelloWorldRequest() {

    }

    public HelloWorldRequest(String sayHelloTo) {
        this.sayHelloTo = sayHelloTo;
    }

    public String getSayHelloTo() {
        return sayHelloTo;
    }

    @Override
    public String toString() {
        return "HelloWorldRequest{" +
                "sayHelloTo='" + sayHelloTo + '\'' +
                '}';
    }
}

当我想测试默认错误处理的正确输出时,我似乎无法使用单元测试检查默认 json 格式的输出。响应似乎总是空的。当我通过正常的 curl 命令触发请求时,会看到正确的响应。我认为这是因为返回的 JSON 无法映射到 HelloWorldResponse。有什么方法可以检查返回的输出在响应正文中是否有效?

测试

class TestSpec extends Specification {

    MockMvc mockMvc

    def setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build()
    }

    def "Test simple action"() {
        when:
        def response = mockMvc.perform(post("/hello")
                .contentType(MediaType.APPLICATION_JSON)
                .content('{"sayHelloTo": ""}')
        )

        then:
        response.andExpect(status().isOk())
    }
}

Json 响应

 {
       "timestamp" : 1426615606,
       "exception" : "org.springframework.web.bind.MissingServletRequestParameterException",
       "status" : 400,
       "error" : "Bad Request",
       "path" : "/welcome",
       "message" : "Required String parameter 'name' is not present"
    }

【问题讨论】:

  • 你能给我们看看你的测试吗?
  • 该死.. 确实忘记了测试!将其添加到问题中。

标签: json spring spring-boot


【解决方案1】:

尝试使用 print() 方法进行调试,可能在执行过程中抛出异常。

MvcResult andReturn = mockMvc.perform(get("/api") .accept(MediaType.APPLICATION_JSON)) .andDo(print()) .andReturn();

【讨论】:

    【解决方案2】:

    您发布的@Controller 类和测试用例(和响应)似乎不匹配(您在测试用例中调用/hello 而您的@RequestMapping/welcome ...我们可以吗?看到正确的代码了吗?看起来您设置了 @RequestParam("name"),但您没有通过它。

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 1970-01-01
      • 2017-09-06
      • 2018-06-27
      • 2015-05-17
      • 2020-10-25
      • 2019-07-30
      • 2018-12-03
      • 2021-08-09
      相关资源
      最近更新 更多