Spring 替换Mockito';s时返回以前使用新实现定义的实现

Spring 替换Mockito';s时返回以前使用新实现定义的实现,spring,unit-testing,junit,mocking,mockito,Spring,Unit Testing,Junit,Mocking,Mockito,我正在将测试添加到一个类似于以下内容的大型代码库中: public class MyTests{ @Mock private DBService dbService; @Before public void init(){ Mockito.when(dbService.getFromDb).thenReturn(getReturnResult()); } } 其中getReturnResults()获取一些伪数据。在99%的情况下,这是我想要的实现,但在测试异常时

我正在将测试添加到一个类似于以下内容的大型代码库中:

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()
获取将导致错误的一些不同数据。我只需要更换这个测试的实现。

我想到两件事:

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

  • 编写一个单独的测试类,仅用于测试异常,然后转到该类
    usedifferentitdbresults()
    和相应的测试方法

  • 我想到两件事:

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

  • 编写一个单独的测试类,仅用于测试异常,然后转到该类
    usedifferentitdbresults()
    和相应的测试方法

  • 如果您想动态地提供mock的结果,那么您可以使用mockito的应答接口。有关更多详细信息,请参阅本文:


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

    如果您希望动态提供模拟的结果,那么您可以使用mockito的应答接口。有关更多详细信息,请参阅本文:


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

    也许您应该移动
    Mockito.when(dbService.getFromDb).然后返回(getReturnResult())init
    方法中选择code>并将其复制到每个需要它的测试中。然后,您可以定义自己的
    Mockito.when(dbService.getFromDb).然后返回(getDifferentReturnResult())
    在您的新测试方法中。@D.Lawrence我特别尝试避免这样做,如果没有其他可用选项,我会这样做。如果您将该方法保留在init中并定义
    Mockito.when(dbService.getFromDb)。然后在方法中返回(getDifferentReturnResult())
    ,它将模拟对该方法的第二次调用。我觉得这也不是你想要做的。@D.Lawrence不幸的是,这对我的场景不起作用,因为我希望所有的电话都返回不同的信息。看起来不使用init是最简单的。除了我当时提到的解决方案,我没有其他解决方案。也许你应该移动
    Mockito.when(dbService.getFromDb)。然后返回(getReturnResult())init
    方法中选择code>并将其复制到每个需要它的测试中。然后,您可以定义自己的
    Mockito.when(dbService.getFromDb).然后返回(getDifferentReturnResult())
    在您的新测试方法中。@D.Lawrence我特别尝试避免这样做,如果没有其他可用选项,我会这样做。如果您将该方法保留在init中并定义
    Mockito.when(dbService.getFromDb)。然后在方法中返回(getDifferentReturnResult())
    ,它将模拟对该方法的第二次调用。我觉得这也不是你想要做的。@D.Lawrence不幸的是,这对我的场景不起作用,因为我希望所有的电话都返回不同的信息。看起来不使用init是最简单的。除了我当时提到的解决方案,我没有其他解决方案。我认为使用单独的测试文件是最好的方法,我很难让dbService2自动注入原始dbService。我认为使用单独的测试文件是最好的方法,我很难让dbService2在原始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
       ...
    }