Spring 启动集成测试。如何测试 'DELETE' 方法?
Spring Boot integration test. How to test the 'DELETE' method?
我正在使用 Spring Boot 2.5.6
和 JUnit 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
方法?
您可以改进两件事:
- 不要提供请求实体 – 它被标记为
@Nullable
- 使用
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的状态会抛出异常。
我正在使用 Spring Boot 2.5.6
和 JUnit 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
方法?
您可以改进两件事:
- 不要提供请求实体 – 它被标记为
@Nullable
- 使用
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的状态会抛出异常。