簡體   English   中英

在Groovy中模擬擴展Java類

[英]Mocking extended java classes in groovy

如何在groovy測試中模擬由groovy(輸入/輸出流)擴展的Java類? 我嘗試了模仿和時髦的模擬,但是沒有運氣。 有什么辦法可以工作嗎? 任何可以處理這種情況的java / groovy庫?

下面有一個groovy servlet,它在InputStream上使用groovy getText方法,在OutputStream上使用setBytes。 如何在Groovy測試中模擬(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)
    }
}

我建議您使用HttpServletRequest和HttpServletResponse的現成的模擬程序,而不要自己模擬類。 模擬Servlet API類非常困難,並且在現實世界中會證明成本太高。

Spring Framework具備以下全部功能: 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構建整個應用程序,仍然可以從其出色的單元測試支持中受益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM