Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用mockito模拟受保护函数_Java_Unit Testing_Gwt_Mockito - Fatal编程技术网

Java 用mockito模拟受保护函数

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

我正在尝试为GWT Servlet编写一个单元测试。 因此,我需要模拟
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类:(