2014-01-23 64 views
2

如何在常規測試中模擬由groovy(輸入/輸出流)擴展的java類?我嘗試了mockito和groovy mocks,但沒有運氣。有什麼辦法可以工作嗎?任何可以處理這種情況的java/groovy庫?在groovy中嘲笑擴展的java類

下面有一個groovy servlet,它使用InputStream上的groovy getText方法和OutputStream上的setBytes。如何嘲笑(1)getText和驗證(2)在常規測試setBytes?

感謝您的幫助,

米哈爾

import javax.servlet.http.HttpServletRequest 
import javax.servlet.http.HttpServletResponse 

@groovy.transform.TypeChecked 
class SomeServlet extends javax.servlet.http.HttpServlet { 

    @Override 
    protected void doPost(final HttpServletRequest request, final HttpServletResponse response) { 
     final String charset = request.getCharacterEncoding(); 
     final String requestPayload = request.getInputStream().getText(charset); // GROOVY getText 
     response.setContentType(request.getContentType()); 
     response.setStatus(200); 
     response.setCharacterEncoding(charset); 
     response.getOutputStream().setBytes(requestPayload.getBytes(charset)) // GROOVY setBytes 
    } 
} 


class SomeServletTest { 
    @org.testng.annotations.Test 
    void aTest() { 
     // given 
     HttpServletRequest request = mock(HttpServletRequest) 
     when(request.getCharacterEncoding()).thenReturn("UTF-8") 
     when(request.getInputStream().getText("UTF-8")).thenReturn("some text") // (1) 

     HttpServletResponse response = mock(HttpServletResponse) 

     def ss = new SomeServlet() 

     // when 
     ss.doPost(request, request) 

     // then 
     verify(response.getOutputStream()).setBytes("some text") // (2) 
    } 
} 

回答

0

我建議你使用,而不是嘲笑自己的類的HttpServletRequest和HttpServletResponse的現成的嘲笑。模擬Servlet API類很困難,並且在現實世界的場景中證明代價太高。

Spring框架已說明了一切: http://docs.spring.io/spring-framework/docs/3.2.x/javadoc-api/org/springframework/mock/web/package-summary.html

使用MockHttpServletRequest和MockHttpServletResponse類,單元測試應該會非常簡單易讀:

import org.springframework.mock.web.MockHttpServletRequest 
import org.springframework.mock.web.MockHttpServletResponse 
import org.testng.Assert 
import org.testng.annotations.Test 

class SomeServletTest { 

    @Test 
    void aTest() { 
     def request = new MockHttpServletRequest(
       characterEncoding: "UTF-8", 
       content: "some text".bytes) 

     def response = new MockHttpServletResponse() 

     def ss = new SomeServlet() 
     ss.doPost(request, response) 

     Assert.assertEquals(response.getContentAsString(), "some text") 
    } 
} 

即使你不想建立自己的全應用程序使用Spring Framework,您仍然可以從其出色的單元測試支持中受益。

+0

春天嘲笑解決我的問題。但是我仍然想知道如何模擬一般由groovy擴展的java類。 – Michal