当前位置: 首页 > 知识库问答 >
问题:

编写JUnit测试用例请求调度程序时出错

颜修为
2023-03-14

我在为请求调度程序编写测试用例时遇到了一些错误。我的类

@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'.

有人能告诉我写这个测试用例的确切方法吗?

共有2个答案

濮阳霄
2023-03-14

看起来您正在使用Mockito进行单元测试。

正如消息告诉您的那样,请执行“何时(…)”要模拟/重写过程调用的位置。但when过程期望您的请求对象是mockito框架中的模拟对象。

即使您创建了一个模拟的ServletRequest对象,但这不是Mockito的模拟对象。

查看mockito起始页;有一个示例:https://code.google.com/p/mockito/在第一个代码块/示例中查看第二行;创建了一个mocked对象,如下所示:

List mockedList = mock(List.class);

意味着您需要像这样创建您的请求对象(而不是使用new运算符):

MockHttpServletRequest request = mock(MockHttpServletRequest.class);

希望这有助于解决您的问题。

纪枫
2023-03-14

我没有足够的信息告诉您“编写此测试用例的确切方法”,StackOverflow不是修复大块代码的好地方,但我可以告诉您为什么会收到这样的消息。:)

MockHttpServletRequest request = new MockHttpServletRequest();

这里有两种“模仿”的感觉:

>

  • Mockito提供的模拟是基于接口自动生成的,并且在和验证时使用等静态方法进行操作。Mockito模拟是使用Mockito.mock(或@Mock当且仅当您使用MockitoJUnitRunnerMockitoAnnotations.initMocks)创建的。

    名称以“Mock”开头的完整类(如MockHttpServletRequest)实际上是整个类的实现,与通过J2EE实际接收到的实现相比,这些实现更容易变异或更改。这些可能更准确地称为“假”,因为它们是用于测试的简单接口实现,不验证行为,也不通过Mockito工作。您可以确定它们不是Mockito mock,因为您使用新的MockHttpServletRequest()实例化了它们

    例如,FilterChain可能由Mockito提供。MockHttpServletRequest不是Mockito模拟,这就是为什么您会收到错误消息的原因。

    您最好选择一种类型的mock,或者选择另一种类型的mock,并确保使用when语句(如果选择Mockito)或setter(如setRequestURI)正确准备这些mock(如果选择MockHttpSession样式的mock)。

  •  类似资料:
    • customer-Mapper.xml daoimpl.java

    • 我想用mock它来模拟下面代码中的数据源对象,但每次我都得到空指针异常。 我试过嘲笑数据源和连接,但似乎什么都不起作用。

    • 问题内容: 我有一个在一个(主)线程中工作的Java代码。从主线程中,我产生了一个新线程,在其中进行服务器调用。服务器调用完成后,我在新线程中进行了一些工作,然后代码加入了主线程。 我正在使用Eclipse Jobs进行服务器调用。 我想知道,如何为此编写一个JUnit测试用例。 问题答案: 您可能需要重组代码,以便可以轻松对其进行测试。 我可以看到几个不同的测试区域: 线程管理代码:启动线程并可

    • 我想为SpringRetry编写一个junit测试用例,我像下面这样尝试过,但是junit没有按预期工作。我打电话给MaxAttemptRetryService。重试方法,如果失败,最多必须尝试3次。在这里,Dao正在调用一个rest服务,即停止,因此它最多应该尝试3次。因此道。sam方法必须调用3次。 服务类别: Dao类: 测试等级:

    • 我是故意在谈论系统测试。我们确实有一套相当详尽的单元测试,其中一些使用了模拟,而这些测试不会去任何地方。系统测试应该是对单元测试的补充,因此,模拟不是一种选择。 如果我将替换为一个test-method(让我们称之为),并引入一个顺序依赖项(使用JUnit 5非常容易),它强制在运行任何其他测试之前运行,那么这些问题就会消失。 到目前为止还好!这看起来和工作很好。当测试不是由CI服务器执行,而是由

    • 我正在尝试为这样的情况编写测试用例,在这个情况下,我期待的是datatruncation异常,我试图使用assert equals和比较消息来断言相同的情况,但是看起来像是比较两个字符串,有没有更好的方法来为这样的异常编写测试用例。 我正在使用JUnit5