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 没有任何作用,因此您可以将其删除。