问题描述
我在为请求调度程序编写测试用例时遇到了一些错误.我的课
I am facing some error while writing test case for Request dispatcher. My class
@Override
public void doFilter(ServletRequest request, ServletResponse resp, FilterChain chain)
throws IOException, ServletException
{
if(isMockAccountEnabled())
{
HttpServletRequest req = (HttpServletRequest)request;
String reqUrl = req.getRequestURI();
ApiUserDetails userDetails = userBean.getUserDetails();
HttpSession session = req.getSession();
if(isThisTestAccount(reqUrl, session))
{
log.info(userDetails);
log.debug("Entering Test acount flow for the request "+reqUrl);
RequestDispatcher dispatcher = req.getRequestDispatcher("/mock/" + EnumService.returnMockService(reqUrl));
dispatcher.forward(request, resp);
}
}
}
编写测试用例
@Mock
private FilterChain chain;
@InjectMocks
private MockAccountFilter mockAccountFilter = new MockAccountFilter();
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
MockHttpSession session = new MockHttpSession();
@Test
public void filterRequestMockFirst()
throws Exception
{
MockRequestDispatcher dispatcher =new MockRequestDispatcher("/mock/ABCTEST");
when(request.getRequestDispatcher("/mock/ABCTEST")).thenReturn(dispatcher);
request.setRequestURI("/check/employee/123456/false");
mockAccountFilter.doFilter(request, response, chain);
Assert.assertTrue(request.getRequestURI().contains("/mock/ABCTEST"));
}
错误
when() requires an argument which has to be 'a method call on a mock'.
谁能告诉我编写这个测试用例的确切方法.
Can some one tell me the exact way of writing this test case.
推荐答案
我没有足够的信息告诉你编写这个测试用例的确切方法",而且 StackOverflow 不是一个获取大块的好地方代码已修复,但我可以告诉您为什么您会收到该消息.:)
I don't have enough information to tell you "the exact way of writing this test case", and StackOverflow isn't a good place to get large blocks of code fixed, but I can tell you why you're getting that message. :)
MockHttpServletRequest request = new MockHttpServletRequest();
这里有两种模拟"的感觉:
There are two senses of "Mock" going on here:
Mockito 提供的模拟是基于接口自动生成的,并使用
when和verify等静态方法进行操作.Mockito 模拟是使用Mockito.mock(或@Mock当且仅当您使用MockitoJUnitRunner或MockitoAnnotations.initMocks).
Mockito-provided mocks are automatically generated based on interfaces, and are manipulated with static methods like
whenandverify. Mockito mocks are created usingMockito.mock(or@Mockif and only if you useMockitoJUnitRunnerorMockitoAnnotations.initMocks).
名称以Mock"开头的完整类,例如 MockHttpServletRequest,实际上是整个类的实现,碰巧比您通过 J2EE 实际接收的更容易变异或更改.这些可能更准确地称为假",因为它们是用于测试的简单接口实现,不验证行为并且不通过 Mockito 工作.您可以确定它们不是 Mockito 模拟,因为您使用 new MockHttpServletRequest(); 实例化它们.
Full classes with names starting with the word "Mock", like MockHttpServletRequest, are actually entire class implementations that happen to be easier to mutate or change than ones you would actually receive through J2EE. These might more accurately be termed "Fake", because they are simple interface implementations for testing that do not verify behavior and do not work through Mockito. You can tell for sure that they're not Mockito mocks because you instantiate them with new MockHttpServletRequest();.
例如,FilterChain 很可能由 Mockito 提供.MockHttpServletRequest request 不是 Mockito 模拟,这就是您收到错误消息的原因.
FilterChain, for instance, will likely be provided by Mockito. MockHttpServletRequest request is not a Mockito mock, which is why you're getting the error message you're getting.
您最好的选择是选择一种类型的模拟或另一种 - 任何一种都可以工作 - 并确保使用 when 语句(如果您选择 Mockito)正确准备这些模拟或像 setRequestURI 这样的设置器(如果您选择 MockHttpSession 样式的模拟).
Your best bet is to pick one type of mock or the other—either will work—and make sure that you're preparing those mocks properly with the when statement (if you choose Mockito) or setters like setRequestURI (if you choose the MockHttpSession-style mocks).
这篇关于编写 JUnit 测试用例请求调度程序时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)