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
...
}