【问题标题】:ConstraintValidator always has null value during testConstraintValidator 在测试期间始终具有空值
【发布时间】:2022-02-07 07:29:08
【问题描述】:

修复旧 Java Spring MVC 4.1 应用程序中的错误后,我想添加一个单元测试,但当前代码库用于测试的方法实际上不会执行验证。

所以我想添加 MVCMock,但是当它执行验证方法时,传递给 isValid 的值始终为 null。

以下相关文件(我已尝试尽可能多地去除噪音):

// 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 {
         // ...
     }
}

可能出了什么问题?

注意:Spring 4.1

【问题讨论】:

  • ex.zip 应该是 file,因为这是模型对象中的名称。名称应与请求参数匹配。您发布的内容也没有意义,您是使用 Mockito 编写单元测试还是使用 MockMVC?这两种方法不匹配(一起使用也没有意义)。
  • 我可能会删除我对 Mockito 的评论,那是 现有的 解决方案也不起作用
  • 如前所述,ex.zip 在您的测试中应该是file
  • 嗯,这就是问题所在,谢谢!你想添加它作为答案吗?

标签: java spring unit-testing spring-mvc junit


【解决方案1】:

file 方法的The javadoc 声明name 应该是文件名。我同意这有点误导。相反,它应该是要使用的请求参数的名称,它应该(通常)与模型对象中的属性相同。

.file("ex.zip",  FileUtils.readFileToByteArray(mockFile));

这样一个名为ex.zip 的请求参数将成为请求的一部分,但是您有一个名为file 的参数。

.file("file",  FileUtils.readFileToByteArray(mockFile));

使用上述行应该可以修复它并正确绑定到您的对象,进而正确调用您的验证器。

在侧节点上,您的验证器也应该正确处理 null 的情况,或者在字段中添加 @NotNull。字段上的 @Valid 不执行任何操作,因此您可以将其删除。

【讨论】:

    猜你喜欢
    • 2020-03-08
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 2020-04-19
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多