Java 如何使用标头模拟HttpServletRequest?

Java 如何使用标头模拟HttpServletRequest?,java,servlets,junit,mockito,Java,Servlets,Junit,Mockito,我正在使用来测试应用程序。我需要在模拟时向一个文件添加标题。这是我第一次使用mock概念来测试应用程序。在使用此模拟概念时,如何为请求对象设置头 应用程序代码 作为主体的起点和演示,您可以从以下代码段开始 // define the headers you want to be returned Map<String, String> headers = new HashMap<>(); headers.put(null, "HTTP/1.1 200 OK&qu

我正在使用来测试应用程序。我需要在模拟时向一个文件添加标题。这是我第一次使用mock概念来测试应用程序。在使用此模拟概念时,如何为请求对象设置头

应用程序代码
作为主体的起点和演示,您可以从以下代码段开始

// define the headers you want to be returned
Map<String, String> headers = new HashMap<>();
headers.put(null, "HTTP/1.1 200 OK");
headers.put("Content-Type", "text/html");

// create an Enumeration over the header keys
Enumeration<String> headerNames = Collections.enumeration(headers.keySet());

// mock HttpServletRequest
HttpServletRequest request = mock(HttpServletRequest.class);
// mock the returned value of request.getHeaderNames()
when(request.getHeaderNames()).thenReturn(headerNames);

System.out.println("demonstrate output of request.getHeaderNames()");
while (headerNames.hasMoreElements()) {
    System.out.println("header name: " + headerNames.nextElement());
}
    
// mock the returned value of request.getHeader(String name)
doAnswer(new Answer<String>() {
    @Override
    public String answer(InvocationOnMock invocation) throws Throwable {
        Object[] args = invocation.getArguments();
        return headers.get((String) args[0]);
    }
}).when(request).getHeader("Content-Type");

System.out.println("demonstrate output of request.getHeader(String name)");
String headerName = "Content-Type";
System.out.printf("header name: [%s]   value: [%s]%n", 
        headerName, request.getHeader(headerName));
}

我知道OP正在使用Mockito。这个答案适用于那些使用spock的人。你可以很容易地做到这一点

class MyTestSpec extends Specification {

    HttpServletRequest request = Mock()
    MyTestClass myTestClass = new MyTestClass()

    def 'my test'() {
        setup:
        String expectedHeader = "x-mycustom-header"

        when:
        String someResult = myTestClass.someTestMethod()

        then:
        // here is where you return your header from the mocked request
        1 * request.getHeader(_ as String) >> expectedHeader
    }
}
是一个复杂的接口,有20多种方法,它们之间有明确的相互作用。另一种方法是使用一个已经具有完整功能的模拟类型的库,而不是仔细模拟您正在使用的模拟类型

库中有一个类正是这样做的。虽然库是为测试应用程序而设计的,但是即使应用程序不使用Spring,
MockHttpServletRequest
类本身也应该完全可用

@BeforeClass
公共静态void init(){
// ...
MockHttpServletRequest mockRequest=新的MockHttpServletRequest();
addHeader(“内容类型”、“文本/html”);
请求.addHeader(“customHeader”、“customValue”);
this.request=mockRequest;
}

这是一个很好的文档,看看吧,你只需要写一些类似Mockito的东西。when(request.getHeaderNames())。然后return(…what your want…)@Sathish如果它解决了你的问题,请接受答案。通过调用java.util.Collections#enumeration创建枚举不是更短了吗?@473183469是的。你说得对
Enumeration headerNames=Collections.Enumeration(headers.keySet())
会更短更智能。;-)<代码>模拟(HttpServletRequest.class)对我不起作用。我可以请你分享一下你所指的Mockito的版本吗?我用的是mockito-core-3.2.4哇,老兄!!谢谢我从
.m2
中删除了jar,然后再次下载。成功了。
// define the headers you want to be returned
Map<String, String> headers = new HashMap<>();
headers.put(null, "HTTP/1.1 200 OK");
headers.put("Content-Type", "text/html");

// create an Enumeration over the header keys
Enumeration<String> headerNames = Collections.enumeration(headers.keySet());

// mock HttpServletRequest
HttpServletRequest request = mock(HttpServletRequest.class);
// mock the returned value of request.getHeaderNames()
when(request.getHeaderNames()).thenReturn(headerNames);

System.out.println("demonstrate output of request.getHeaderNames()");
while (headerNames.hasMoreElements()) {
    System.out.println("header name: " + headerNames.nextElement());
}
    
// mock the returned value of request.getHeader(String name)
doAnswer(new Answer<String>() {
    @Override
    public String answer(InvocationOnMock invocation) throws Throwable {
        Object[] args = invocation.getArguments();
        return headers.get((String) args[0]);
    }
}).when(request).getHeader("Content-Type");

System.out.println("demonstrate output of request.getHeader(String name)");
String headerName = "Content-Type";
System.out.printf("header name: [%s]   value: [%s]%n", 
        headerName, request.getHeader(headerName));
}
class MyTestSpec extends Specification {

    HttpServletRequest request = Mock()
    MyTestClass myTestClass = new MyTestClass()

    def 'my test'() {
        setup:
        String expectedHeader = "x-mycustom-header"

        when:
        String someResult = myTestClass.someTestMethod()

        then:
        // here is where you return your header from the mocked request
        1 * request.getHeader(_ as String) >> expectedHeader
    }
}