我正在使用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<>("")和回傳型別的引數對String.class我來說似乎很奇怪。我為什么要使用它們?我可以更直接地做同樣的事情而不傳遞不必要的引數嗎?
另一方面,TestRestTemplate template有一套簡短易讀的方法delete()。他們的問題 - 他們回傳void,在這種情況下我無法檢查回應狀態代碼。
主要問題是如何DELETE正確地測驗方法?
uj5u.com熱心網友回復:
new HttpEntity<>("") HttpEntity您可以HttpEntity.EMPTY在這些情況下使用呼叫,而不是傳入一個特殊的類變數。您還可以使用 void 回傳型別。
ResponseEntity<Void> resp = template.exchange(url, HttpMethod.DELETE, HttpEntity.EMPTY, Void.class);
uj5u.com熱心網友回復:
你可以改進的兩件事:
- 不要提供請求物體——它被標記為
@Nullable - 使用
Void.class作為回傳型別來表達,你不希望任何回應體
ResponseEntity<Void> resp = restTemplate.exchange(url, HttpMethod.DELETE, null, Void.class);
uj5u.com熱心網友回復:
其他人給出不同的選擇,但如果你要使用的delete方法-它在內部通過拋出運行時錯誤處理HTTP錯誤,你可以看到在這里。您可以檢查HttpClientErrorException或HttpServerErrorException使用assertDoesNotThrow來自 JUnit5
uj5u.com熱心網友回復:
在我看來 RestTemplate.delete 方法是可以使用的方法,回傳型別為 void 但狀態 2XX 以外的狀態將引發例外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341005.html
