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不是修复大量代码的好地方,但我可以告诉你为什么会收到这个消息。:) 这里有两种“模仿”的感觉:
when
和verify
。Mockito mock是使用Mockito.mock
创建的(或@mock
当且仅当您使用MockitoJUnitRunner
或MockitoAnnotations.initmock
)MockHttpServletRequest
,实际上是整个类的实现,与您实际通过J2EE接收的实现相比,它们更容易变异或更改。这些可能更准确地称为“假”,因为它们是用于测试的简单接口实现,不验证行为,也不通过Mockito工作。您可以确定它们不是Mockito mock,因为您使用new MockHttpServletRequest()实例化它们代码>
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);