我正在尝试测试强制转换事件:
定义:
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/