Spring 启动集成测试。如何测试 'DELETE' 方法?

Spring Boot integration test. How to test the 'DELETE' method?

我正在使用 Spring Boot 2.5.6JUnit 4.13.2。我的任务是测试 DELETE 方法

我的 REST 控制器:

@RestController
public class DomainEndpoint {

    private final SomeService service;

    @DeleteMapping("/domain/{id}")
    public void delete(@PathVariable long id) {
        service.delete(id);
    }
}

我的测试:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
public class DomainEndpointTest {

    @Autowired
    TestRestTemplate template;

    @MockBean
    SomeService service;

    @Test
    public void delete() {
        String url = "/domain/123";
        ResponseEntity<?> resp = template.exchange(url, HttpMethod.DELETE, new HttpEntity<>(""), String.class);
        assertEquals(HttpStatus.NO_CONTENT, resp.getStatusCode());
    }
}

如您所见,我找到的测试 'DELETE' 方法的唯一解决方案是:

ResponseEntity<?> resp = template.exchange(url, HttpMethod.DELETE, new HttpEntity<>(""), String.class);

但是正文 new HttpEntity<>("") 和 return 类型 String.class 的参数对我来说似乎很奇怪。我为什么要使用它们?我可以不传递不必要的参数更直接地做同样的事情吗?
另一方面,TestRestTemplate template 有一组简短易读的方法 delete()。他们的问题 - 他们 return void 在这种情况下我无法检查响应状态代码。

主要问题是如何正确测试 DELETE 方法?

您可以改进两件事:

  1. 不要提供请求实体 – 它被标记为 @Nullable
  2. 使用 Void.class 作为 return 类型来表示您不需要任何响应正文
ResponseEntity<Void> resp = restTemplate.exchange(url, HttpMethod.DELETE, null, Void.class);

而不是传入 new HttpEntity<>("") HttpEntity 有一个特殊的 class 变量,您可以在这些情况下使用名为 HttpEntity.EMPTY 的变量。您还可以使用 return 类型的 void。

ResponseEntity<Void> resp = template.exchange(url, HttpMethod.DELETE, HttpEntity.EMPTY, Void.class);

其他人给出了不同的选项,但如果您想使用 delete 方法 - 它通过抛出运行时错误在内部处理 http 错误,正如您在 JUnit5here. You can check for HttpClientErrorException or HttpServerErrorException by using assertDoesNotThrow 中看到的那样

在我看来RestTemplate.delete方法是可以使用的方法,return类型为void但非2XX的状态会抛出异常。