ConstraintValidator 在测试期间始终具有空值
ConstraintValidator always has null value during test
修复了旧 Java Spring MVC 4.1 应用程序中的错误后,我想添加一个单元测试,但当前代码库用于测试的方法实际上不会执行验证。
所以我想添加MVCMock,但是当它执行验证方法时,传递给isValid
的值总是空的。
下面的相关文件(我尽量去除了噪音):
// Unit Test
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@EnableWebMvc
@ContextConfiguration(locations = {"/applicationContext-test.xml"})
public class ExampleControllerTest extends AbstractControllerTestBase {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = webAppContextSetup(this.context).build();
}
@Test
public void fileUploadZipArchive() throws Exception {
// Upload a zip file
File mockFile = new File("src/test/resources/fixtures/ex.zip");
MockHttpServletRequestBuilder multipart = MockMvcRequestBuilders
.fileUpload("/files/ex/upload/Tex")
.file("ex.zip", FileUtils.readFileToByteArray(mockFile));
MvcResult result = mockMvc.perform(multipart)
.andReturn();
}
// Bean
public class FileUploadBean {
@Valid
@MultipartMimeTypeMatch
private MultipartFile file = null;
// ...
}
// Validator
public class MultipartMimeTypeMatchValidator implements ConstraintValidator<MultipartMimeTypeMatch, Object> {
// ...
public boolean isValid(Object value, final ConstraintValidatorContext context) {
// value and context is always null
}
}
// Controller
@RequestMapping(value = "/files/{ex1}/upload/{ex2}", method = RequestMethod.POST)
public Object uploadFile(HttpServletRequest request, @PathVariable String ex1,
@PathVariable String ex2, @Valid FileUploadBean fileUploadBean, BindingResult result) throws IllegalStateException, IOException {
// ...
}
}
可能出了什么问题?
注意:Spring4.1
file
方法的 The javadoc 指出 name
应该是文件的名称。我同意这有点误导。相反,它应该是要使用的请求参数的名称,(一般来说)应该与模型对象中的 属性 相同。
.file("ex.zip", FileUtils.readFileToByteArray(mockFile));
有了这个,名为 ex.zip
的请求参数将成为请求的一部分,但是您有一个名为 file
.
的请求参数
.file("file", FileUtils.readFileToByteArray(mockFile));
使用上面的行应该修复它并正确绑定到您的对象,进而正确调用您的验证器。
在侧节点上,您的验证器也应该正确处理 null
情况,或者在该字段上也添加 @NotNull
。字段上的 @Valid
没有任何作用,因此您可以将其删除。
修复了旧 Java Spring MVC 4.1 应用程序中的错误后,我想添加一个单元测试,但当前代码库用于测试的方法实际上不会执行验证。
所以我想添加MVCMock,但是当它执行验证方法时,传递给isValid
的值总是空的。
下面的相关文件(我尽量去除了噪音):
// Unit Test
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@EnableWebMvc
@ContextConfiguration(locations = {"/applicationContext-test.xml"})
public class ExampleControllerTest extends AbstractControllerTestBase {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = webAppContextSetup(this.context).build();
}
@Test
public void fileUploadZipArchive() throws Exception {
// Upload a zip file
File mockFile = new File("src/test/resources/fixtures/ex.zip");
MockHttpServletRequestBuilder multipart = MockMvcRequestBuilders
.fileUpload("/files/ex/upload/Tex")
.file("ex.zip", FileUtils.readFileToByteArray(mockFile));
MvcResult result = mockMvc.perform(multipart)
.andReturn();
}
// Bean
public class FileUploadBean {
@Valid
@MultipartMimeTypeMatch
private MultipartFile file = null;
// ...
}
// Validator
public class MultipartMimeTypeMatchValidator implements ConstraintValidator<MultipartMimeTypeMatch, Object> {
// ...
public boolean isValid(Object value, final ConstraintValidatorContext context) {
// value and context is always null
}
}
// Controller
@RequestMapping(value = "/files/{ex1}/upload/{ex2}", method = RequestMethod.POST)
public Object uploadFile(HttpServletRequest request, @PathVariable String ex1,
@PathVariable String ex2, @Valid FileUploadBean fileUploadBean, BindingResult result) throws IllegalStateException, IOException {
// ...
}
}
可能出了什么问题?
注意:Spring4.1
file
方法的 The javadoc 指出 name
应该是文件的名称。我同意这有点误导。相反,它应该是要使用的请求参数的名称,(一般来说)应该与模型对象中的 属性 相同。
.file("ex.zip", FileUtils.readFileToByteArray(mockFile));
有了这个,名为 ex.zip
的请求参数将成为请求的一部分,但是您有一个名为 file
.
.file("file", FileUtils.readFileToByteArray(mockFile));
使用上面的行应该修复它并正确绑定到您的对象,进而正确调用您的验证器。
在侧节点上,您的验证器也应该正确处理 null
情况,或者在该字段上也添加 @NotNull
。字段上的 @Valid
没有任何作用,因此您可以将其删除。