2010-12-17 1 views
1

Я работаю в среде, использующей commons-fileupload.Как написать единичные тесты с помощью commons-fileupload?

Теперь мне нужно написать классы тестирования модулей. Мое сомнение заключается в том, как писать макетные тесты, если ServletFileUpload не является интерфейсом? Есть еще один способ проверить мои занятия?

Вчера я написал модульные тесты, используя mockito для Servlet Parts, и это легко. Но я не могу думать, как писать тесты для commons-fileupload.

ответ

0

Вы можете вернуться к основам и ручным переводом вашего макетного объекта путем обертывания или расширения и переопределения. Иногда его легче не зависеть от насмешливой рамки для всего.

Mocking Mocking and Testing Outcomes

+0

Спасибо. Я сделал это с вашим приближением: https://github.com/caelum/vraptor/commit/32ffd075c58925571723c775d256561a9cc10267 – 2010-12-19 23:40:03

0

Я хотел бы рассмотреть оборачивать ваши FileUpload вызовы в другом слое. Хотя это может показаться излишним, это позволит вам быстро переключать загрузки библиотек с добавленной способностью улучшать модульное тестирование ваших звонков ... Похоже, вы тесно связываете свое приложение с общедоступным файлом ...

1

Вы можете использовать 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(); 
     } 

    } 
} 
Смежные вопросы