gpt4 book ai didi

java - 在 groovy 中模拟扩展的 java 类

转载 作者:行者123 更新时间:2023-11-29 08:53:58 25 4
gpt4 key购买 nike

如何在 groovy 测试中模拟由 groovy(输入/输出流)扩展的 java 类?我试过 mockito 和 groovy mocks 但没有运气。有什么方法可以工作吗?任何可以处理这种情况的 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 框架拥有一切: 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 构建整个应用程序,您仍然可以受益于其出色的单元测试支持。

关于java - 在 groovy 中模拟扩展的 java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21316182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com