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

Java 编写JUnit测试用例请求调度程序时出错,java,junit,mockito,Java,Junit,Mockito,在为请求调度器编写测试用例时,我遇到了一些错误。 我的班级 编写测试用例 @Mock private FilterChain chain; @InjectMocks private MockAccountFilter mockAccountFilter = new MockAccountFilter(); MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletResponse respo

在为请求调度器编写测试用例时,我遇到了一些错误。 我的班级

编写测试用例

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

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

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

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

  • Mockito提供的mock是根据接口自动生成的,并使用静态方法进行操作,如
    when
    verify
    。Mockito mock是使用
    Mockito.mock
    创建的(或
    @mock
    当且仅当您使用
    MockitoJUnitRunner
    MockitoAnnotations.initmock

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

  • 例如,FilterChain很可能由Mockito提供
    MockHttpServletRequest请求
    不是Mockito mock,这就是为什么您会收到错误消息


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

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

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

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

    看看mockito的起始页;有一个例子: 在第一个代码块/示例上,查看第二行;在此处创建模拟对象,如下所示:

    List mockedList = mock(List.class);
    
    意味着您需要像这样创建请求对象(而不是使用新运算符):


    希望这能帮助并解决您的问题。

    MockHttpXxx类不是Mockito Mock。它们是实现servlet接口的简单POJO,但可以通过setter进行配置。模拟请求将返回一个模拟调度程序AFAIK。您在测试中没有使用调度程序,因此可以删除线路。谢谢您的回答。
    MockHttpServletRequest request = new MockHttpServletRequest();
    
    List mockedList = mock(List.class);
    
    MockHttpServletRequest request = mock(MockHttpServletRequest.class);