簡體   English   中英

spring-webmvc/hibernate-validator 在測試期間不會使錯誤數據無效

[英]spring-webmvc/hibernate-validator not invalidating bad data during test

我正在閱讀Spring In Action ,並且正在研究 spring-mvc 的示例spittr spring-mvc應用程序。 該書討論了使用javax.annotation.constraints來描述有效數據,例如

import javax.validation.constraints.*;
public class Spitter {
   @NotNull
   @Size(min=5, max=16)
   private String username;
   //...
}

然后,它說,您可以使用@Valid裝飾器對 arguments 的方法應用驗證,例如

import        javax.validation.Valid;
import        org.springframework.stereotype.Controller;
import        org.springframework.validation.Errors;
import        org.springframework.web.bind.annotation.RequestMapping;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
@Controller
@RequestMapping({"/spitter"})
public class SpitterController {
  @RequestMapping(value="/register", method=POST)
  public String processRegistration(@Valid Spitter spitter, Errors errors) {
    if (errors.hasErrors()) {
      return "registerForm";
    }
    return "redirect:/spitter/" + spitter.getUsername();
  }
  //...
}

為了檢查我對材料的理解,我嘗試編寫一些測試來查看該方法對無效數據的反應:

import        org.junit.Test;
import        org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultBuilders.*;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*;
public class SpitterControllerTest {
  @Test
  public void shouldNotProcessEmptyRegistration() throws Exception {
    standaloneSetup(new SpitterController())
      .build()
      .perform(post("/spitter/register"))
      .andExpect(view().name("registerForm"));
  }
  @Test
  public void shouldNotProcessInvalidRegistration() throws Exception {
    standaloneSetup(new SpitterController())
      .build()
      .perform(post("/spitter/register").param("username", "x"))
      .andExpect(view().name("registerForm"));
  }
  //...
}

當測試失敗時我很驚訝

shouldNotProcessEmptyRegistration(spittr.web.SpitterControllerTest)  Time elapsed: 0.013 sec  <<< FAILURE!
java.lang.AssertionError: View name expected:<registerForm> but was:<redirect:/spitter/null>
shouldNotProcessInvalidRegistration(spittr.web.SpitterControllerTest)  Time elapsed: 0.013 sec  <<< FAILURE!
java.lang.AssertionError: View name expected:<registerForm> but was:<redirect:/spitter/x>

我不知道我做錯了什么。 我知道在測試時發生的事情與類路徑上的內容有很大關系:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.1.0.RELEASE</version>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.0.1</version>
</dependency>
<dependency>
  <groupId>org.hibernate.validator</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>6.1.13.Final</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>5.1.0.RELEASE</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.13.2</version>
  <scope>test</scope>
</dependency>

我認為我很可能遺漏了一些書中沒有提到的依賴關系,但在這一點上我不太確定我做錯了什么。

我通過谷歌搜索找到的大部分內容都討論了 spring-boot,我現在正試圖推遲; 在我開始嘗試了解 spring-boot 帶來的內容之前,我想先了解 spring(但Spring Boot In Action在我的閱讀列表中是下一個)。

我需要做什么來修復我的代碼,以便 controller 在測試時成功檢測到無效數據?

似乎在您的代碼中,您要求 spitter 的用戶名不是 null,但這並不意味着整個 object 不能是 null。在您當前的設置中,請求正文是可選的。 你可以試試:

public String processRegistration(@RequestBody @Valid Spitter spitter, Errors errors)

默認情況下@RequestBody使主體成為必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM