Java 重头戏2.4:如何使用MultipartFormData编写文件上传测试用例

Java 重头戏2.4:如何使用MultipartFormData编写文件上传测试用例,java,playframework,playframework-2.4,Java,Playframework,Playframework 2.4,到目前为止(直到播放2.3),我使用了Helpers.fakeRequest().withAnyContent()来创建一个模拟请求。例如 private Request getMultiPartFormDataRequestForFileUpload(File file, String filePartKey, String contentType) { FilePart<TemporaryFile> part = new MultipartFormData

到目前为止(直到播放2.3),我使用了
Helpers.fakeRequest().withAnyContent()
来创建一个模拟请求。例如

private Request getMultiPartFormDataRequestForFileUpload(File file,
        String filePartKey, String contentType) {
    FilePart<TemporaryFile> part = new MultipartFormData.FilePart<>(
            filePartKey, file.getName(), Scala.Option(contentType),
            new TemporaryFile(file));
    List<FilePart<TemporaryFile>> fileParts = new ArrayList<>();
    fileParts.add(part);
    scala.collection.immutable.List<FilePart<TemporaryFile>> files = scala.collection.JavaConversions
            .asScalaBuffer(fileParts).toList();
    MultipartFormData<TemporaryFile> formData = new MultipartFormData<TemporaryFile>(
            null, files, null, null);
    return Helpers.fakeRequest().withAnyContent(formData);
}

有人知道我如何编写测试用例来检查2.4中使用MultipartFormData上传的文件吗?

作为助手。FakereRequest是一种非常简单的方法(取自github)

您可以扩展Http.RequestBuilder,从而访问受保护的方法:

public class FakeRequestBuilder extends HttpRequestBuilder() {
   public RequestBuilder setAnyBody(RequestBody body, String contentType) {
     header("Content-Type", contentType);
     body(body);
   }
}
并在测试中使用:

 //OLD return Helpers.fakeRequest().withAnyContent(formData);
 //NEW
 return new FakeRequestBuilder().setAnyBody(formData, "multipart/form-data").build(); 
 //or is it application/x-www-form-urlencoded for you?
在Play2.4中,body()不接受RequestBody,您必须首先从multipart创建AnyContent。例如:

private class FakeRequestBuilder extends Http.RequestBuilder {
    public FakeRequestBuilder(String method, String uri) {
        method(method).uri(uri);
    }

    protected RequestBuilder setAnyBody(MultipartFormData<TemporaryFile> formData, String contentType) {
        header("Content-Type", contentType);
        AnyContent anyContent = new AnyContentAsMultipartFormData(formData);
        body(anyContent);
        return this;
    }
}
私有类FakerRequestBuilder扩展了Http.RequestBuilder{
公共FakerRequestBuilder(字符串方法,字符串uri){
方法(method).uri(uri);
}
受保护的RequestBuilder SetAnywhere(MultipartFormData formData,String contentType){
标题(“内容类型”,contentType);
AnyContent AnyContent=新的AnyContentAsMultipartFormData(formData);
正文(任何内容);
归还这个;
}
}
可以通过以下方式创建MultiPartFormData thingie,例如:

private MultipartFormData<TemporaryFile> createFormData(String contentType, String filePartKey, File file) {
    FilePart<TemporaryFile> part = new MultipartFormData.FilePart<>(filePartKey, file.getName(), Scala.Option(contentType), new TemporaryFile(file));
    List<FilePart<TemporaryFile>> fileParts = new ArrayList<>();
    fileParts.add(part);
    scala.collection.immutable.List<FilePart<TemporaryFile>> files = scala.collection.JavaConversions.asScalaBuffer(fileParts).toList();
    MultipartFormData<TemporaryFile> formData = new MultipartFormData<TemporaryFile>(null, files, null, null);
    return formData;
}
private MultipartFormData createFormData(字符串contentType、字符串filePartKey、文件File){
FilePart part=new MultipartFormData.FilePart(filePartKey,file.getName(),Scala.Option(contentType),new TemporaryFile(file));
List fileParts=new ArrayList();
fileParts.add(part);
scala.collection.immutable.List files=scala.collection.JavaConversions.asScalaBuffer(fileParts.toList();
MultipartFormData formData=新的MultipartFormData(null,files,null,null);
返回表单数据;
}

谢谢!我等会再试试。谢谢你,简,但没用。很抱歉回复晚了(迟做总比不做好)。使用您的FakerRequestBuilder,我得到一个
scala.MatchError:AnyContentAsMultipartFormData
。但我的内容类型是“application/zip”。我想这和你有关。谢谢你的帮助。我试过你的解决办法。我还试着用Mockito的mock。对于这两个问题,我最终得到了一个
scala.MatchError:AnyContentAsMultipartFormData
,这似乎就是本期的问题。
private class FakeRequestBuilder extends Http.RequestBuilder {
    public FakeRequestBuilder(String method, String uri) {
        method(method).uri(uri);
    }

    protected RequestBuilder setAnyBody(MultipartFormData<TemporaryFile> formData, String contentType) {
        header("Content-Type", contentType);
        AnyContent anyContent = new AnyContentAsMultipartFormData(formData);
        body(anyContent);
        return this;
    }
}
private MultipartFormData<TemporaryFile> createFormData(String contentType, String filePartKey, File file) {
    FilePart<TemporaryFile> part = new MultipartFormData.FilePart<>(filePartKey, file.getName(), Scala.Option(contentType), new TemporaryFile(file));
    List<FilePart<TemporaryFile>> fileParts = new ArrayList<>();
    fileParts.add(part);
    scala.collection.immutable.List<FilePart<TemporaryFile>> files = scala.collection.JavaConversions.asScalaBuffer(fileParts).toList();
    MultipartFormData<TemporaryFile> formData = new MultipartFormData<TemporaryFile>(null, files, null, null);
    return formData;
}