我如何模仿Mockito的超级方法?

时间:2017-07-03 06:56:10

标签: java junit mockito

我需要模拟对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);

3 个答案:

答案 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

这可能有帮助