【问题标题】:Replace Mockito's when thenReturn implementation that was previously defined with new implementation替换 Mockito 的 when thenReturn 之前定义的实现为新的实现
【发布时间】:2019-12-06 16:25:44
【问题描述】:

我正在向与此类似的大型代码库添加测试:

public class MyTests{
  @Mock
  private DBService dbService;

  @Before
  public void init(){
    Mockito.when(dbService.getFromDb).thenReturn(getReturnResult());
  }
}

getReturnResults() 在哪里得到一些假数据。在 99% 的情况下,这是我想要的实现,但是在测试异常时,我想做这样的事情:

  @Test
  public void useDifferentDBResults(){
    Mockito.when(dbService.getFromDb).thenReturn(getDifferentReturnResult());
    ...
  }

getDifferentReturnResult() 获取一些不同的数据会导致错误。我只需要替换这个测试的实现即可。

【问题讨论】:

  • 也许您应该将Mockito.when(dbService.getFromDb).thenReturn(getReturnResult()); 移出init 方法并将其复制到每个需要它的测试中。然后你可以在你的新测试方法中定义你自己的Mockito.when(dbService.getFromDb).thenReturn(getDifferentReturnResult());
  • @D.Lawrence 我特别想避免这样做,如果没有其他选项可用,我会这样做。
  • 如果将方法保留在 init 中并在方法中定义 Mockito.when(dbService.getFromDb).thenReturn(getDifferentReturnResult()),它将模拟对该方法的第二次调用。我觉得这也不是你想要做的。
  • @D.Lawrence 不幸的是,这不适用于我的场景,因为我希望所有调用都返回这些不同的信息。看起来不使用 init 是最简单的。
  • 除了我当时提到的解决方案之外,我没有任何其他解决方案。

标签: spring unit-testing junit mocking mockito


【解决方案1】:

我想到了两件事:

  1. 在同一个测试类中引入DBService 的第二个实例并在“...在测试异常时”使用它:

    @Mock
    private DBService dbService;
    
    @Mock
    private DBService dbService2;
    
    @Before
    public void init() {
       Mockito.when(dbService.getFromDb).thenReturn(getReturnResult());
       Mockito.when(dbService2.getFromDb).thenReturn(getDifferentReturnResult());
    }
    
    ...
    
    @Test
    public void useDifferentDBResults(){
       // Use dbService2 here
       ...
    }
    

  1. 编写一个单独的测试类,仅用于测试异常并移至该类useDifferentDBResults() 和相应的测试方法。

【讨论】:

  • 我认为使用单独的测试文件是最好的方法,我无法让 dbService2 自动注入原始 dbService。
【解决方案2】:

如果你想动态提供模拟结果,那么你可以使用模拟的 Answer 接口。有关详细信息,请参阅此帖子:

Dynamic return values with Mockito

尽管如此,我认为在测试中重复自己以使每个测试方法更具可读性是一种最佳做法。所以我的建议是将模拟初始化移动到每个测试方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多