【发布时间】:2022-01-24 10:58:08
【问题描述】:
我正在尝试测试另一种方法使用的 getCookieByName 方法。但是,不确定我是否正确执行此操作,因为该方法似乎被多次调用,并且它在第一次尝试时设置了值,但在最后一次调用时为空。我认为模拟调用的顺序可能是错误的,或者其中一些可能不需要,但是如果我删除了任何内容,我仍然会遇到其他错误,所以不确定我实际上做错了什么。
@Service
public class CookieSessionUtils {
private static final String VIADUCT_LOCAL_AMP = "viaductLocalAmp"; // Value to be changed when the test runs to test the "if Y" scenario.
public boolean verifyState(HttpServletRequest request, String state) {
String viaductLocalAmp = getCookieByName(request, VIADUCT_LOCAL_AMP);
if (viaductLocalAmp.equalsIgnoreCase("Y")) {
return true;
}
return false;
}
public String getCookieByName(HttpServletRequest request, String cookieName) {
try {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
return cookie.getValue();
}
}
}
} catch (Exception e) {
ExceptionLogger.logDetailedError("CookieSessionUtils.getCookieByName", e);
log.error("Error on Cookie " + e.getMessage());
}
return "";
}
这些是我的测试和模拟调用,以及两次 getCookieByName() 在同一方法中被调用。
@Autowired
private CookieSessionUtils cookieSessionUtils;
@Mock
private HttpServletRequest request;
@Test
public void testVerifyStateWhenCookieNameStartsWithY() {
Cookie mockCookie = Mockito.mock(Cookie.class);
when(mockCookie.getName()).thenReturn("viaductLocalAmp");
when(mockCookie.getValue()).thenReturn("viaductLocalAmp");
when(request.getCookies()).thenReturn(new Cookie[]{mockCookie});
when(cookieSessionUtils.getCookieByName(request, "viaductLocalAmp")).thenReturn("Y");
assertTrue(cookieSessionUtils.verifyState(httpServletRequest, "viaductLocalAmp"));
}
谢谢。
【问题讨论】:
-
最后一个断言中的
httpServletRequest是什么?不应该是request吗? -
您使用
when(cookieSessionUtils.getCookieByName(request, "viaductLocalAmp")).thenReturn("Y");在被测系统上存根方法。我觉得奇怪的是它不抛出 - 它是 SpyBean 吗? -
好的,谢谢。你俩都是对的。我有两个用于 HttpRequest 的对象,一个叫做 request 的对象实际上是用 atMockBean 而不是 atMock 注释的。仅使用 @Mock 解决了这个问题。
标签: java spring-boot unit-testing mockito