Java 如何使用commons fileupload编写单元测试?
我在一个使用commons fileupload的框架中工作 现在我需要编写单元测试类。我的疑问是,如果ServletFileUpload不是接口,如何编写模拟测试?还有别的方法来测试我的课程吗Java 如何使用commons fileupload编写单元测试?,java,testing,mockito,apache-commons-fileupload,Java,Testing,Mockito,Apache Commons Fileupload,我在一个使用commons fileupload的框架中工作 现在我需要编写单元测试类。我的疑问是,如果ServletFileUpload不是接口,如何编写模拟测试?还有别的方法来测试我的课程吗 昨天,我使用mockito为Servlet部件编写了单元测试,这很简单。但是我不知道如何为commons fileupload编写测试。您可以回到基础,通过包装或扩展和覆盖手动滚动您的模拟对象。有时候,不依赖一个模仿框架来完成所有事情会更容易 您可以回到基础,通过包装或扩展和覆盖手动滚动模拟对象。有时候
昨天,我使用mockito为Servlet部件编写了单元测试,这很简单。但是我不知道如何为commons fileupload编写测试。您可以回到基础,通过包装或扩展和覆盖手动滚动您的模拟对象。有时候,不依赖一个模仿框架来完成所有事情会更容易
您可以回到基础,通过包装或扩展和覆盖手动滚动模拟对象。有时候,不依赖一个模仿框架来完成所有事情会更容易
我会考虑在另一个层面上包装你的文件。虽然它听起来像是过多的,但它允许你很快地切换上传库,增加了更好的单元测试你的调用的能力……看起来你正在紧密地将你的应用程序连接到Calon FieluPoad… < P>我会考虑把你的FieluPoad调用打包在另一个层中。虽然这听起来有点过分,但它可以让您非常快速地切换上载库,并增加更好地单元测试您的调用的功能…看起来您正在将应用程序与commons fileupload紧密耦合…您可以使用commons HTTPClient构建多部分流:
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletFileUploadMock {
public static class FileUpload {
private final String filename;
private final String mimeType;
private final byte[] contents;
public FileUpload(String filename, String mimeType, byte[] contents) {
this.filename = filename;
this.mimeType = mimeType;
this.contents = contents;
}
}
public static HttpServletResponse mockServletFileUpload(HttpServlet servlet, List<FileUpload> files,
Map<String, String> queryParams) throws IOException, ServletException {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
for (FileUpload f : files) {
builder = builder.addBinaryBody(f.filename, f.contents, ContentType.create(f.mimeType), f.filename);
}
HttpEntity entity = builder.build();
ByteArrayOutputStream os = new ByteArrayOutputStream();
entity.writeTo(os);
ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
when(mockRequest.getMethod()).thenReturn("POST");
when(mockRequest.getContentType()).thenReturn(entity.getContentType().getValue());
when(mockRequest.getContentLength()).thenReturn((int)entity.getContentLength());
when(mockRequest.getInputStream()).thenReturn(new MockServletInputStream(is));
// Mock query params
for (Entry<String, String> p : queryParams.entrySet()) {
when(mockRequest.getParameter(p.getKey())).thenReturn(p.getValue());
}
HttpServletResponse mockResponse = mock(HttpServletResponse.class);
servlet.service(mockRequest, mockResponse);
return mockResponse;
}
public static class MockServletInputStream extends ServletInputStream {
private final InputStream delegate;
public MockServletInputStream(InputStream delegate) {
this.delegate = delegate;
}
@Override
public int read() throws IOException {
return delegate.read();
}
}
}
导入静态org.mockito.mockito.mock;
导入静态org.mockito.mockito.when;
导入org.apache.http.HttpEntity;
导入org.apache.http.entity.ContentType;
导入org.apache.http.entity.mime.MultipartEntityBuilder;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
导入javax.servlet.ServletException;
导入javax.servlet.ServletInputStream;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
公共类ServletFileUploadMock{
公共静态类文件上载{
私有最终字符串文件名;
私有最终字符串mimeType;
私有最终字节[]内容;
公共文件上载(字符串文件名、字符串mimeType、字节[]内容){
this.filename=文件名;
this.mimeType=mimeType;
this.contents=目录;
}
}
公共静态HttpServletResponse mockServletFileUpload(HttpServletServlet,列表文件,
映射查询参数)抛出IOException、ServletException{
MultipartEntityBuilder=MultipartEntityBuilder.create();
用于(文件上载f:文件){
builder=builder.addBinaryBody(f.filename,f.contents,ContentType.create(f.mimeType),f.filename);
}
HttpEntity=builder.build();
ByteArrayOutputStream os=新建ByteArrayOutputStream();
实体。书面形式(os);
ByteArrayInputStream=新的ByteArrayInputStream(os.toByteArray());
HttpServletRequest mockRequest=mock(HttpServletRequest.class);
when(mockRequest.getMethod())。然后返回(“POST”);
when(mockRequest.getContentType()).thenReturn(entity.getContentType().getValue());
当(mockRequest.getContentLength()).thenReturn((int)entity.getContentLength());
当(mockRequest.getInputStream())。然后返回(新的MockServletInputStream(is));
//模拟查询参数
对于(条目p:queryParams.entrySet()){
when(mockRequest.getParameter(p.getKey())。然后return(p.getValue());
}
HttpServletResponse mockResponse=mock(HttpServletResponse.class);
服务(mockRequest、mockResponse);
返回模拟响应;
}
公共静态类MockServletInputStream扩展了ServletInputStream{
私有最终输入流委托;
公共MockServletInputStream(InputStream委托){
this.delegate=委托;
}
@凌驾
public int read()引发IOException{
返回delegate.read();
}
}
}
您可以使用Commons HTTPClient构建多部分流:
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletFileUploadMock {
public static class FileUpload {
private final String filename;
private final String mimeType;
private final byte[] contents;
public FileUpload(String filename, String mimeType, byte[] contents) {
this.filename = filename;
this.mimeType = mimeType;
this.contents = contents;
}
}
public static HttpServletResponse mockServletFileUpload(HttpServlet servlet, List<FileUpload> files,
Map<String, String> queryParams) throws IOException, ServletException {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
for (FileUpload f : files) {
builder = builder.addBinaryBody(f.filename, f.contents, ContentType.create(f.mimeType), f.filename);
}
HttpEntity entity = builder.build();
ByteArrayOutputStream os = new ByteArrayOutputStream();
entity.writeTo(os);
ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
when(mockRequest.getMethod()).thenReturn("POST");
when(mockRequest.getContentType()).thenReturn(entity.getContentType().getValue());
when(mockRequest.getContentLength()).thenReturn((int)entity.getContentLength());
when(mockRequest.getInputStream()).thenReturn(new MockServletInputStream(is));
// Mock query params
for (Entry<String, String> p : queryParams.entrySet()) {
when(mockRequest.getParameter(p.getKey())).thenReturn(p.getValue());
}
HttpServletResponse mockResponse = mock(HttpServletResponse.class);
servlet.service(mockRequest, mockResponse);
return mockResponse;
}
public static class MockServletInputStream extends ServletInputStream {
private final InputStream delegate;
public MockServletInputStream(InputStream delegate) {
this.delegate = delegate;
}
@Override
public int read() throws IOException {
return delegate.read();
}
}
}
导入静态org.mockito.mockito.mock;
导入静态org.mockito.mockito.when;
导入org.apache.http.HttpEntity;
导入org.apache.http.entity.ContentType;
导入org.apache.http.entity.mime.MultipartEntityBuilder;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
导入javax.servlet.ServletException;
导入javax.servlet.ServletInputStream;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
公共类ServletFileUploadMock{
公共静态类文件上载{
私有最终字符串文件名;
私有最终字符串mimeType;
私有最终字节[]内容;
公共文件上载(字符串文件名、字符串mimeType、字节[]内容){
this.filename=文件名;
this.mimeType=mimeType;
this.contents=目录;
}
}
公共静态HttpServletResponse mockServletFileUpload(HttpServletServlet,列表文件,
映射查询参数)抛出IOException、ServletException{
MultipartEntityBuilder=MultipartEntityBuilder.create();
用于(文件上载f:文件){
builder=builder.addBinaryBody(f.filename,f.contents,ContentType.create(f.mimeType),f.filename);
}
HttpEntity=builder.build();
ByteArrayOutputStream os=新建ByteArrayOutputStream();
实体。书面形式(os);
ByteArrayInputStream=新的ByteArrayInputStream(os.toByteArray());
HttpServletRequest mockRequest=mock(HttpServletRequest.class);
when(mockRequest.getMethod())。然后返回(“POST”);
当(mockRequest.getContentType()).thenReturn(entity.getContentType().getValue()时