当前位置: 首页 > 知识库问答 >
问题:

Spring Boot REST Controller集成测试返回406而不是500

牧梓
2023-03-14

我有一个控制器,其endpoint可以生成压缩数据的字节流。下面代码中的MyDtO和ZipService类是自定义类,它们的功能类似于POJO,我想将其内容添加到zip中,服务将获取POJO的字节并将其写入ZipoutStream,然后通过封装在带有相应HttpStatus和标头。“快乐路径”工作正常,正在按预期生成zip文件。

@GetMapping(path = "/{id}/export", produces = "application/zip")
public ResponseEntity<byte[]> export(@ApiParam(required = true) @PathVariable(value = "id") String id) throws IOException {
    try {
        MyDTO myDTO = myService.getDTO(id);
        byte[] zippedData = zipService.createZip(myDTO.getBytes());
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""name.zip\"");
        return new ResponseEntity<>(zipDTO.getData(), httpHeaders, HttpStatus.OK);
    } catch (ZipException e) {
        return new ResponseEntity(e.getRestError(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

当我想测试抛出自定义ZipException的情况时,问题出在我的联调类中(如果压缩数据存在问题,则可能会发生这种情况)。我们在组织中必须遵守的标准之一是,每个自定义异常都需要扩展Exception并拥有一个名为RestError的自定义对象,该对象具有表示自定义错误代码和消息的String变量

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class RestError {

    private String code;
    private String message;

    //Constructors

    //Getters and setters
}

此对象似乎导致集成测试出现问题

@Test
public void myIntegrationTest() throws Exception {
    MyDTO myDTO = new MyDTO();
    RestError restError = new RestError("Custom error code", "Custom error message")
    ZipException zipException = new ZipException(restError);
    given(myService.getDTO("id")).willReturn(myDTO);
    given(zipService.createZip(any(), any())).willThrow(zipException);

    mockMvc.perform(get("/{id}/export", "id").accept(MediaType.ALL)
            .andDo(print())
            .andExpect(status().is5xxServerError());
}

在这种情况下,我预计HttpStatus将达到500,但MockMvc将达到406-内容不可接受。我把测试弄得一团糟,这样它就可以接受和期望任何/所有数据,但每次仍会遇到406错误。我知道这与异常的RestError对象有关,因为如果我从控制器返回的ResponseEntity中取出它,那么就会返回预期的响应状态。在此方面的任何帮助都将不胜感激。

共有1个答案

杭永安
2023-03-14

@GetMap(path="/{id}/export",产生="Application/zip")中删除生成项并将其更改为@GetMap(path="/{id}/export")

由于这个原因,在测试用例执行期间,返回了406错误,如果删除它,您将得到您要抛出的确切错误。

但是,请检查zip文件是否按预期下载。

 类似资料:
  • 我正在尝试为我的Spring项目运行集成测试,它是一个简单的get方法,用于从DB返回给定id的字符串输出。但是在Mockmvc中,我一直在Mockmvc上得到一个NullPointerException。在我的测试范围内执行。 以下是测试: 这里是控制器-输出控制器: 完全错误是:

  • 我试图让2支球队互相比赛。当我说团队1.玩(团队2)时,我称之为;当 i 生成的数字小于 0.5 时,team2 应获胜,如果大于 0.5,则团队 1 应获胜。当团队 1 获胜时,它会正确显示为尼克斯,但当团队 2 获胜时,它会显示内存地址。我怎么能让它正确地说网是赢的,而不是team@78987neu73

  • 我有一个用selenium进行单元测试和集成测试的项目。 当我用IntelliJ执行cucumber集成测试时,它工作得很好,您可以看到: 用Intellij执行cucumber集成测试 但是,当我执行mvn集成测试时,似乎没有发现任何联调: 故障保护输出 我定义了以下POM: > 文件夹结构是文件夹结构 mvn集成-测试输出https://drive . Google . com/file/d/

  • 我试图用Java创建一个XPath表达式(8,默认XPath实现)。我正在做以下工作: 我在同一级别的文档中有多个PartyId节点,因为它的父节点是重复的。我得到了结果,但只有一个节点。(第一)。 补充信息:如果我在表达式的末尾写[$k],比如[1]或[2],我得到了我的元素,但是我需要它们。:( 但是,如果我正在测试同一个XPath,例如http://www.freeformatter.com

  • 英文原文:http://emberjs.com/guides/testing/integration/ 集成测试通常用来测试应用中得重要工作流。集成测试用来模拟用户交互和确认交互结果。 设置 为了对Ember应用进行集成测试,需要在测试框架中运行应用。首先需要将根元素(root element)设置为任意一个已知将存在的元素。如果根元素在测试运行时可见的话,这对测试驱动开发非常有用,带来的帮助非常