我正在使用 Mockito 来模拟HttpServletRequest
和HttpServletResponse
. 我想在我创建的模拟请求中添加 cookie。我该怎么做?
我也在服务器端的响应中设置cookie。如何从服务器发送的模拟响应中检索 cookie?
你可以尝试这样的事情。
import javax.servlet.http.Cookie;
@RunWith(MockitoJUnitRunner.class)
public class TestClass {
private MockHttpServletRequest servletRequest;
@Before
public void setUp() {
servletRequest = new MockHttpServletRequest();
Cookie[] cookies = new Cookie[]{
new Cookie("test_key", "test_value")
};
servletRequest.setCookies(cookies);
}
@Test
public void methodTest() {
Assert.assertEquals("test_value", servletRequest.getCookies()
[0].getValue());
}
}
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
class ComponentTests {
private HttpServletRequest testRequest = Mockito.mock(HttpServletRequest.class);
@Test
void testMethod() {
Cookie[] testCookies = new Cookie[]{new Cookie("name", "value")};
Mockito.when(testRequest.getCookies()).thenReturn(testCookies);
// Assertions
}
}
对于请求:构造数组,添加任何Cookies
你想要的,然后将行为添加到模拟中:
final Cookies[] cookies = new Cookies[] { ... };
final HttpServletRequest request = mock(HttpServletRequest.class);
given(request.getCookies()).thenReturn(cookies);
... pass to controller/servlet etc ...
对于响应,您创建模拟,然后addCookie
通过使用ArgumentCaptor
捕获传递给的实际 cookie 来验证调用addCookie
:
final ArgumentCapor<Cookie> captor = ArgumentCaptor.forClass(Cookie.class);
verify(response).addCookie(captor.capture());
final List<Cookie> cookies = captor.getValue();
... perform asserion on cookies ...
或者构建预期的 cookie 并验证:
final Cookie expectedCookie = ...
verify(response).addCookie(expectedCookie);
就我个人而言,我不喜欢使用 an ArgumentCaptor
,但这在很大程度上取决于您的测试。
使用实现 HttpServletResponse 的 MockHttpServletResponse。它有 getCookies / getCookie 方法,可以在其上进行断言。
最好的方法是使用 SpringMockHttpServletRequest
和MockHttpServletResponse
.
它们是带有 cookie 获取器的包装器实现。这些正是您确保可以验证 cookie 设置所需要的。Mockito 在这里是不够的。