我在为请求调度程序编写测试用例时遇到了一些错误。我的类
@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'.
有人能告诉我写这个测试用例的确切方法吗?
看起来您正在使用Mockito进行单元测试。
正如消息告诉您的那样,请执行“何时(…)”要模拟/重写过程调用的位置。但when过程期望您的请求对象是mockito框架中的模拟对象。
即使您创建了一个模拟的ServletRequest对象,但这不是Mockito的模拟对象。
查看mockito起始页;有一个示例:https://code.google.com/p/mockito/在第一个代码块/示例中查看第二行;创建了一个mocked对象,如下所示:
List mockedList = mock(List.class);
意味着您需要像这样创建您的请求对象(而不是使用new运算符):
MockHttpServletRequest request = mock(MockHttpServletRequest.class);
希望这有助于解决您的问题。
我没有足够的信息告诉您“编写此测试用例的确切方法”,StackOverflow不是修复大块代码的好地方,但我可以告诉您为什么会收到这样的消息。:)
MockHttpServletRequest request = new MockHttpServletRequest();
这里有两种“模仿”的感觉:
>
Mockito提供的模拟是基于接口自动生成的,并且在和验证
时使用等静态方法进行操作。Mockito模拟是使用
Mockito.mock
(或@Mock
当且仅当您使用MockitoJUnitRunner
或MockitoAnnotations.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