java - 模拟的模拟 Actor

标签 java unit-testing mocking mockito

我正在尝试测试强制转换事件:

定义:

private RestAPIAuthenticationFilterMod re;
ServletRequest sRequestMock;
ServletResponse sResponseMock;

@Before
public void setup() {
    re=new RestAPIAuthenticationFilterMod();
    sRequestMock  = Mockito.mock(ServletRequest.class,  withSettings().extraInterfaces(HttpServletRequest.class));
    sResponseMock = Mockito.mock(ServletResponse.class, withSettings().extraInterfaces(HttpServletResponse.class));
}

有问题的行:

 ((HttpServletRequest) request).getHeader("CuentaUsuario");

“请求”是一个模拟,我想生成响应“JMUNOZ”

我尝试了这个,但它继续执行真正的代码:

    @Test
    public void onAccessDeniedNotAuthorizedIsJWTLogInAttemptTest() throws Exception {


    Subject subjectUnderTest = Mockito.mock(Subject.class);

    setSubject(subjectUnderTest);
    when(subjectUnderTest.isAuthenticated()).thenReturn(true);
    when((sRequestMock).getAttribute("whitelisted")).thenReturn(Boolean.TRUE);

    HttpServletRequestWrapper httpMock= Mockito.mock(HttpServletRequestWrapper.class);
    when((httpMock).getHeader("CuentaUsuario")).thenReturn("JMUNOZ");
    when(((HttpServletRequest)sRequestMock).getHeader("CuentaUsuario")).thenReturn("JMUNOZ");
    re.onAccessDenied(sRequestMock, sResponseMock);
}

这是我的 SUT:

  protected boolean isUserHostCallAttempt(ServletRequest request, ServletResponse response) {
    try {
        String userName = ((HttpServletRequest) request).getHeader("CuentaUsuario");
        return (userName != null) && (!"".equalsIgnoreCase(userName)) && (isWhiteListed(request));
    } catch (Exception e) {
        log.error(ERROR, e);
    }
    return false;
}


   private boolean isWhiteListed(ServletRequest request) {
    if (null == request.getAttribute("whitelisted")) {
        return false;
    }
    return ((Boolean) request.getAttribute("whitelisted")).booleanValue();
}

解决方案(无断言):

 @Test
public void onAccessDeniedNotAuthorizedIsJWTLogInAttemptTest() throws Exception {
    Subject subjectUnderTest = Mockito.mock(Subject.class);
    setSubject(subjectUnderTest);
    when(subjectUnderTest.isAuthenticated()).thenReturn(true);

    HttpServletRequestWrapper httpMock= Mockito.mock(HttpServletRequestWrapper.class);

    when((httpMock).getAttribute(Mockito.anyString())).thenReturn(Boolean.TRUE);
    when((httpMock).getHeader(Mockito.anyString())).thenReturn("JMUNOZ");
    re.onAccessDenied(httpMock, sResponseMock);
}

谢谢大家。

最佳答案

类型 HttpServletRequestWrapper 已经扩展了 HttpServletRequest,因此您可以直接模拟 httpMock.getHeader。不要单独模拟父类(super class)型,创建一个模拟并在两个地方使用它。

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

相关文章:

firebase - 使用 Jest、Firebase 和 React-Native 运行测试

perl - 我如何在 Perl 中模拟 Web 服务器?

java - android中的改造-使用对象而不是json中的数组

java - 查找包含一个点的矩形

java - Java中的方 block 游戏线AI

python - 在Python中模拟对象的构造函数

Java字符串匹配: € symbol is â¬

node.js - 我应该如何在 Mocha 单元测试中初始化 Mongoose 连接?

php - 您将如何为此类类(class)编写测试?

java - 如何 stub /模拟 JDBC ResultSet 以与 Java 5 和 6 一起工作?