java - 如何使用 commons-fileupload 编写单元测试?

标签 java testing mockito apache-commons-fileupload

我在使用 commons-fileupload 的框架中工作。

现在我需要编写单元测试类。我的疑问是,如果 ServletFileUpload 不是接口(interface),如何编写模拟测试?还有另一种方法可以测试我的类(class)吗?

昨天我使用 mockito 为 Servlet 部件编写了单元测试,这很简单。但是我想不出如何为 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();
        }

    }
}

关于java - 如何使用 commons-fileupload 编写单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4466770/

相关文章:

java - 带有外部 Activity MQ 的 JBoss FUSE 7.4 给出 AMQ219013 : Timed out waiting to receive cluster topology. Group:null

用于跨平台的 Java GUI

testing - Rails 测试,如何指定发布路径? (没有路由匹配错误)

testing - Sinon stub withArgs 忽略额外参数

java - 使用 Mockito 的最佳实践

java - Maven 没有看到 Mockito 测试?

java - 通过 Maven 运行时,Checkstyle 可以定位特定文件吗?

java - 如何使用 DynamoDBAutoGeneratedKey 给我一个自动生成的 key ?

java - JUnit 和 Spring 的 DAO 层测试策略

java - 如何使用 Mockito 模拟可分页对象?