我需要模拟对GenericService的findById方法的调用。
我有这个:
public class UserServiceImpl extends GenericServiceImpl<User Integer> implements UserService, Serializable {
....
// This call i want mock
user = findById(user.getId());
.....
// For example this one calls mockeo well. Why is not it a call to the generic service?
book = bookService.findById(id);
问题出在第一个模拟中,因为它是对通用服务的调用。
第二个模拟效果也很好
when(bookService.findById(anyInt())).thenReturn(mockedBook);
答案 0 :(得分:2)
以下是我发现在我的案例中解决了同样问题的一个例子 -
public class BaseController {
public void method() {
validate(); // I don't want to run this!
}
}
public class JDrivenController extends BaseController {
public void method(){
super.method()
load(); // I only want to test this!
}
}
@Test
public void testSave() {
JDrivenController spy = Mockito.spy(new JDrivenController());
// Prevent/stub logic in super.method()
Mockito.doNothing().when((BaseController)spy).validate();
// When
spy.method();
// Then
verify(spy).load();
}
答案 1 :(得分:1)
创建UserServiceImpl类的间谍: http://www.baeldung.com/mockito-spy
间谍是对象的包装器,您仍然可以为其定义行为,例如:存根超类的 findById()方法,但与模拟不同,非存根方法仍称其实际实现。
class GenericServiceImpl {
public void findById(){
fail("not found");
}
}
class UserServiceImpl extends GenericServiceImpl {
public void methodA() {
findById();
}
}
@Test
public void testSpy() {
UserServiceImpl userService = Mockito.spy(new UserServiceImpl());
Mockito.doNothing().when(userService).findById();
userService.methodA();
}
答案 2 :(得分:-2)
你实际上是在试图模仿超级实现,设计糟糕的声音。
如果你不能重构,你可以使用Powermock
试着看看这篇文章:Mockito How to mock only the call of a method of the superclass
这可能有帮助