【发布时间】:2016-05-12 15:51:54
【问题描述】:
我有一个 service/dao 层。服务层方法调用 dao 的第一个方法,我从中获得响应并调用 dao 中的第二个方法,传递一些参数,包括来自第一个 dao 方法的响应的值。我尝试使用模拟,但它因空指针而失败。 伪代码如下:
Service{
serviceMethod(some_args){
response1 = dao.method1(some_args);
someItem = response1.get("someItem");
/* do some logic on someitem to create otherItem*/
request2.setArgs(someItem);
response2 = dao.method2(request2);
}
}
我试图模拟如下,但它不起作用。
@Test
public void testPass(){
mockResponse1 = new Response1();
mockRequest2 = new MockRequest2();
when(dao.method1(some_args)).thenReturn(mockResponse1)
mockResponse1.setArgs(some_args);
mockRequest2.setArgs(mockResponse1.getargs());
mockResponse2 = new Response2();
when(dao.method2(mockRequest2)).thenReturn(mockResponse2)
service.serviceMethod(some_args)
}
【问题讨论】:
-
这是一个真正的java代码还是只是一个伪代码?我看到 mockResponse1 是一个实际实例,而 mockResponse2 也是一个实际实例。如果你调用这些模拟,我期待的是模拟(Response1.class)和模拟(Response2.class)。如果您实际上没有注意到这一点,那么这就是您的问题。
-
code is something like如果不包含实际创建模拟的代码 (=dao) 并且还包括将模拟注入到服务等级。此外,mockRequest2没有在您的测试代码中的任何地方定义 -
更新了伪代码
-
请贴出真实代码和NPE的stacktrace
-
由于您显然无法提供MCVE,这将变成一场猜谜游戏。 NPE 可能是由于没有将
dao定义为mock(SomeDao.class)并将此dao-mock 注入Service以便在服务方法内部对dao的调用。由于在测试执行期间我们不知道您的服务类中的 dao 是什么,因此它可能会调用真正的 dao 类,或者 dao 可能为 null 并导致 NPE,除了不遵守您定义的规则。
标签: java unit-testing spring-mvc mockito