Java 如何在具有Postgresql后端的数据源上对连接失败进行单元测试?

Java 如何在具有Postgresql后端的数据源上对连接失败进行单元测试?,java,database,unit-testing,database-connection,Java,Database,Unit Testing,Database Connection,为了在数据库中断期间测试web服务的行为,我想在单元测试中模拟连接故障。数据库后端是Postgresql,代码使用了一些非标准SQL查询,这使得很难使用普通内存数据库进行测试。数据库连接可以通过将连接管理推迟到ConnectionPool的 如何在单元测试中模拟临时/间歇性数据库断开,以验证正确的错误处理和从连接中断中恢复?正如@duffymo所提到的,模拟是一种方法 若您真的要进行单元测试,您已经可以使用由模拟框架创建的模拟了,因为单元测试需要通过用测试双精度替换它们的依赖关系来隔离各个单元。

为了在数据库中断期间测试web服务的行为,我想在单元测试中模拟连接故障。数据库后端是Postgresql,代码使用了一些非标准SQL查询,这使得很难使用普通内存数据库进行测试。数据库连接可以通过将连接管理推迟到ConnectionPool的


如何在单元测试中模拟临时/间歇性数据库断开,以验证正确的错误处理和从连接中断中恢复?

正如@duffymo所提到的,模拟是一种方法

若您真的要进行单元测试,您已经可以使用由模拟框架创建的模拟了,因为单元测试需要通过用测试双精度替换它们的依赖关系来隔离各个单元。模拟框架是创建这种双重测试的最简单和最稳定的方法

但我猜您是在用单元测试框架执行集成测试,不管出于什么原因,都将它们称为“单元测试”

然而

由于您的测试依赖于datasouces的真正功能,因此spy将是一个很好的选择,如下所示:

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时失败(因此原因错误)。

创建一个失败的模拟连接。我需要一个最初工作的连接,几秒钟后失败,然后又起作用了。模仿是你唯一的希望。你猜对了,我用错了术语。