首页 > 解决方案 > Mockito 让 mock 从现有的 mock 继承存根

问题描述

我有两个来自同一类的模拟对象,两个对象之间的唯一区别是不同的状态。在我可以测试状态差异之前,我需要存根一些方法,这意味着我必须为这两个对象都做这件事,这对我来说似乎效率不高。

我对 java 的单元测试有以下设置:

@Mock
private CuratorFramework zkClient;
@Mock
private CuratorFramework zkClientNotStarted;

@BeforeEach
void beforeEach() {

    when(zkClient.getState()).thenReturn(CuratorFrameworkState.STARTED);
    when(zkClient.checkExists()).thenReturn(existsBuilder);
    when(zkClient.exampleMethod()).thenReturn(exampleObject);
    ...

    when(zkClientNotStarted.getState()).thenReturn(CuratorFrameworkState.LATENT);
    when(zkClientNotStarted.checkExists()).thenReturn(existsBuilder);
    when(zkClientNotStarted.exampleMethod()).thenReturn(exampleObject);
    ...
}

这让我很不爽,因为有很多重复的代码,找不到类似这样的东西:

@Mock
private CuratorFramework zkClient;
@Mock
private CuratorFramework zkClientNotStarted;    
@Mock
private CuratorFramework zkClientBase;

@BeforeEach
void beforeEach() {

    when(zkClientBase.checkExists()).thenReturn(existsBuilder);
    when(zkClientBase.checkExists()).thenReturn(existsBuilder);
    when(zkClientBase.exampleMethod()).thenReturn(exampleObject);
    ...

    zkClient.inheritStubs(zkClientBase)
    when(zkClient.getState()).thenReturn(CuratorFrameworkState.STARTED);

    zkClientNotStarted.inheritStubs(zkClientBase);
    when(zkClientNotStarted.getState()).thenReturn(CuratorFrameworkState.LATENT);

}

有没有办法将模拟克隆/复制到继承初始化存根的新模拟?或者这是 Mockito 框架的错误用例?

我发现的唯一类似问题是这个:Mockito: Mock object based on another 5 多年前就有人问过这个问题。我希望在那段时间有所改变。

标签: javaunit-testingmockingmockito

解决方案


推荐阅读