使用 Mockito 调用真实方法

Pat*_*tty 1 java spring mockito spring-boot

我正在使用 JDK 11 和 Spring Boot。我正在实现一个 REST API,有 3 层:

  • 控制器
  • 服务层
  • 数据访问层

我在数据访问层有针对接口的类,并且在服务层没有任何接口。

我使用 MockMvc、Mockito 等编写集成测试,以测试控制器公开的每个点的整个路径。直到我尝试在服务层引入接口,这才成为问题。

最初,我只嘲笑存储库/Daos。所以类结构如下:

    public interface ClientRepo{
    ......
    }

    public class ClientRepoImpl implements ClientRepo{
    ......
    }
Run Code Online (Sandbox Code Playgroud)

将返回的数据模拟为:

    @MockBean 
    private ClientRepo client;

    ....
    Mockito.when(client.isExistFkUnitId(Mockito.any(UUID.class))).thenReturn(false); 
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好。

现在我在服务层引入了接口:

    public interface ClientService{
    ......
    }

    public class ClientServiceImpl implements ClientService{
    ......
    }
Run Code Online (Sandbox Code Playgroud)

并尝试(尝试调用实际的服务方法)

    @MockBean 
    private ClientService clientService;

    ....
    Mockito.when(clientService.isExistFkUnitId(Mockito.any())).thenCallRealMethod();
Run Code Online (Sandbox Code Playgroud)

但始终只得到 null

有没有办法让真正的方法调用保持接口不变?

pam*_*voy 5

我认为您想在要调用真实方法的字段上使用@Spy注释而不是注释。@Mock不过,我碰巧没有例子来验证这一点。 https://javadoc.io/doc/org.mockito/mockito-core/2.21.0/org/mockito/Spy.html

然后你就可以做doCallRealMethod().when(clientService.isExistFkUnitId(Mockito.any()))。因为使用间谍对象,您可以调用doReturn/when而不是when/doReturn. https://javadoc.io/doc/org.mockito/mockito-core/2.21.0/org/mockito/Mockito.html#do_family_methods_stubs