为了测试数据库中断期间Web服务的行为,我想在单元测试中模拟连接失败。数据库后端是Postgresql,代码使用一些非标准的SQL查询,这使得很难使用vanilla内存数据库进行测试。可以通过DataSource访问数据库连接,该连接将管理连接到ConnectionPool。
如何在单元测试中模拟临时/间隔数据库断开连接以验证错误处理和从连接中断中恢复?
正如@duffymo所提到的,模拟是要走的路。
如果您真的要进行单元测试,那么您已经使用了模拟框架创建的Mocks,因为单元测试需要通过用测试双精度替换它们的依赖关系来隔离各个单元。模拟框架是创建此类测试双精度的最简单,最稳定的方法。
但是我猜你正在使用UnitTesting Framework执行集成测试,无论出于何种原因称它们为“单元测试”。
然而..
由于您的测试依赖于数据的真实功能,间谍将是一个很好的选择,如下所示:
class DatasourceUsageTest{
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void reportDatabaseOutage(){
// arrange
DataSource myDatasource = aquireDatasourceSomehow();
DataSource spyOfMyDatasource = Mockito.spy(myDatasource);
Mockito.doCallRealMethod() // first call
.doThrow(new SqlException("Report this message") // second call (and all following)
.when(spyOfMyDatasource).methodExpectedToFail();
SomeType testedUnit = createUnitAndInject(spyOfMyDatasource );
// act call #1
testedUnit.theMethodUsingDatasource();
Mockito.verify(spyOfMyDatasource).methodExpectedToFail();
// act call #2
exception.expect(TheExceptionTypeToBeThrown.class);
exception.expectMessage(EXCEPTION_MESSAGE_PREFIX + "Report this message");
testedUnit.theMethodUsingDatasource();
// Code below this will not be executed
}
}
这里的问题(与任何集成测试一样)是您的数据库可能存在真正的问题,在这种情况下,此测试在调用#1时失败(因此出于错误的原因)。