Java 用mockito模拟受保护函数
我正在尝试为GWT Servlet编写一个单元测试。 因此,我需要模拟Java 用mockito模拟受保护函数,java,unit-testing,gwt,mockito,Java,Unit Testing,Gwt,Mockito,我正在尝试为GWT Servlet编写一个单元测试。 因此,我需要模拟AbstractRemoteServiceServlet的getThreadLocalRequest()函数,这样我就不会得到NPE 该函数是受保护的,因此根据mocktio常见问题解答,只要我在同一个包中,就可以对其进行模拟。 因此,我尝试了以下方法: HttpServletRequest request = mock(HttpServletRequest.class); svc = spy(new GreetingServ
AbstractRemoteServiceServlet
的getThreadLocalRequest()
函数,这样我就不会得到NPE
该函数是受保护的,因此根据mocktio常见问题解答,只要我在同一个包中,就可以对其进行模拟。
因此,我尝试了以下方法:
HttpServletRequest request = mock(HttpServletRequest.class);
svc = spy(new GreetingServiceImpl());
doReturn(request).when(svc).getThreadLocalRequest();
但我得到以下错误,即函数不可见:
The method `getThreadLocalRequest()` from the type `AbstractRemoteServiceServlet` is not visible
如果您能就这个问题提供任何建议,或者为我的问题提供更好的解决方案,我将不胜感激。Mockito无法修改java规则以提高可见性,并且当(svc)不在
getThreadLocalRequest()
可见的包中时,Mockito无法修改的返回值
确保测试类与AbstractRemoteServiceServlet
位于同一个包中,或者通过反射调用getThreadLocalRequest
方法:
Method getThreadLocalRequestMethod = AbstractRemoteServiceServlet.class.getDeclaredMethod("getThreadLocalRequest");
Object target = doReturn(request).when(svc);
Object regetThreadLocalRequestMethod.invoke(target);
您可以尝试System.out.println(doReturn(request).when(svc.getClass().getName())吗
并验证该类是否在您期望的包中?它与AbstractRemoteServiceServlet不在同一个包中,而是与扩展AbstractRemoteServiceServlet的servlet在同一个包中,因此它也有受保护的方法。我认为这就够了。但无论如何,我刚刚意识到该方法是最终的,因此没有值得进一步研究。是的,不幸的是Mockito不能模拟final方法或final类:(