[英]Spring boot REST: cannot test validation of @RequestParam
我想測試 controller 的 Spring 啟動 API 與 ZA2F2ED4F8EBC2CBB4C21A29DC40AB61 結構如下:
Controller:
@RestController
@RequestMapping("/member-management")
@Validated
public class MemberManagementController {
private final MemberManagementService memberManagementService;
public MemberManagementController(MemberManagementService memberManagementService) {
this.memberManagementService = memberManagementService;
}
@GetMapping(value = "/view-member")
public ResponseEntity<?> viewMember(
@NotBlank(message = "username must not be blank!!")
@Size(max = 20, message = "maximum size of username id is 20!!")
@RequestParam("username") String username) {
...
}
...
Controller 建議:
@ControllerAdvice
public class CustomRestExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<Object> handleConstaintViolatoinException(final ConstraintViolationException ex) {
List<String> details = new ArrayList<>();
Set<ConstraintViolation<?>> violations = ex.getConstraintViolations();
for (ConstraintViolation<?> violation : violations) {
details.add(violation.getMessage());
}
ApiErrorResUtil error = new ApiErrorResUtil(String.valueOf(HttpStatus.BAD_REQUEST.value()),
"Request param error", details);
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
...
}
單元測試:
@RunWith(MockitoJUnitRunner.class)
public class MemberManagementControllerTest {
@InjectMocks
private MemberManagementController memberManagementController;
@Mock
private MemberManagementService memberManagementService;
private MockMvc mockMvc;
@Before // Execute before each test method
public void setup() {
this.mockMvc = MockMvcBuilders.standaloneSetup(memberManagementController)
.setControllerAdvice(new CustomRestExceptionHandler()) // add ControllerAdvice to controller test
.build();
}
@Test
public void viewMember_usernameSizeExceedsMaximumLimit() throws Exception {
// Value from client
String username = "a12345678901234567890"; // 21 characters
MemberResDtoDataDummy memberResDtoDataDummy = new MemberResDtoDataDummy();
when(memberManagementService.viewMember(username)).thenReturn(memberResDtoDataDummy.getMember1());
mockMvc.perform(get("/member-management/view-member").param("username", username))
.andExpect(status().isBadRequest()).andReturn();
}
問題:
java.lang.AssertionError: Status expected:<400> but was:<200>
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59)
...
誰能幫我解決這個問題,為什么預期狀態是 200 而不是 400,其他輸入無效參數的 POST、PUT、PATCH、DELETE 請求方法的測試仍然可以正常工作:(
當您想在不啟動服務器的情況下測試您的 UI 層時,您必須將此測試定義為 spring-boot 測試並自動連接MockMvc
。
@SpringBootTest @AutoConfigureMockMvc
此類注釋將在沒有服務器的情況下加載所有 applicationContext。
如果您只想加載 web 層,只需將此注釋放在您的測試 class 上。
@WebMvcTest
使用此注釋 Spring Boot 僅實例化 web 層而不是整個上下文。
在這兩種情況下,您都必須自動裝配MockMvc
類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.