Grails 集成测试用例中的模拟 CommonsMultipartFile

Mock CommonsMultipartFile in Grails integration test case

我有一个接受 CommonsMultipartFile 并将其上传到服务器的服务方法

class ExampleService() {
    def saveFile(CommonsMultipartFile file) {
        // some validation code for file
    }
}

尝试同时使用 MockMultipartHttpServletRequestGrailsMockMultipartFile

如果 MockMultipartHttpServletRequest 出现错误:

|  org.codehaus.groovy.runtime.typehandling.GroovyCastException: 
Cannot cast object 'org.springframework.mock.web.MockMultipartFile@2f39360' 
with class 'org.springframework.mock.web.MockMultipartFile' to 
class 'org.springframework.web.multipart.commons.CommonsMultipartFile'

GrailsMockMultipartFile 一样,出现以下错误:

|  org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot 
cast object 'org.codehaus.groovy.grails.plugins.testing.GrailsMockMultipartFile@1022f0bd' 
with class 'org.codehaus.groovy.grails.plugins.testing.GrailsMockMultipartFile' to 
class 'org.springframework.web.multipart.commons.CommonsMultipartFile'

引用了这个

我应该如何模拟 CommonsMultipartFile 并将其作为参数传递到我的测试用例中?


解决方案

我找到了解决方案,请查看我的

在经历了不同的堆栈溢出链接和 CommonsMultipartFile JDK 之后,我想出了这个解决方案

如果我使用了错误的方法,请告诉我@burtbeckwith

File getTestFile(String fileName = "") {
    //Code which create file instance 
}

// Inside my test case I have created CommonsMultipartFile test file and used it.
DiskFileItemFactory factory = new DiskFileItemFactory()
FileItem fileItem = factory.createItem( "file", "multipart/form-data", false, "logo.png" )
IOUtils.copy(new FileInputStream(getTestFile()), fileItem.getOutputStream())
CommonsMultipartFile testFile = new CommonsMultipartFile(fileItem)

如果您更改 saveFile(CommonsMultipartFile) 方法以接受接口 MultipartFile 的实例而不是特定的实现,它将更容易模拟并且您应该不会失去任何功能。

saveFile(MultipartFile)