【问题标题】:Mock return value for cookie.getValue() using Mockito使用 Mockito 模拟 cookie.getValue() 的返回值
【发布时间】: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


【解决方案1】:

我在断言下使用了错误的对象。 @httpRequest 使用@MockBean 进行注释,而请求使用@Mock,这是我应该在此场景中使用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2019-01-06
    • 2017-10-17
    • 2021-01-07
    • 2020-01-21
    • 1970-01-01
    相关资源
    最近更新 更多