Java 即使呼叫已验证,连接也未关闭

Java 即使呼叫已验证,连接也未关闭,java,spring,jdbc,junit,mockito,Java,Spring,Jdbc,Junit,Mockito,你能帮我理解这段代码吗 我正在尝试验证数据库连接是否已关闭。 即使Mocikto验证是否调用了close()方法,连接也不会关闭 我正在测试的代码(它在con.close()中使用): 和测试: public class DataProviderTest { @InjectMocks DataProvider dataProvider; @Mock OracleConnection oracleConnection; @Mock Databa

你能帮我理解这段代码吗

我正在尝试验证数据库连接是否已关闭。 即使Mocikto验证是否调用了close()方法,连接也不会关闭

我正在测试的代码(它在con.close()中使用):

和测试:

public class DataProviderTest {

    @InjectMocks
    DataProvider dataProvider;

    @Mock
    OracleConnection oracleConnection;

    @Mock
    DatabaseMetaData databaseMetadata;

    @Mock
    PoolDataSource dataSource;

    @Mock
    OracleCallableStatement oracleCallableStatement;

    @BeforeEach
    public void setUp() throws SQLException {
        MockitoAnnotations.initMocks(this);
        ReflectionTestUtils.setField(dataProvider, "parseSQLErrorFuntion", "Some SQL error function");
        Mockito.when(dataSource.getConnection()).thenReturn(oracleConnection);
        Mockito.when(oracleConnection.getMetaData()).thenReturn(databaseMetadata);
        Mockito.when(oracleConnection.prepareCall(Mockito.anyString())).thenReturn(oracleCallableStatement);
    }

    @Test
    public void closeConnectionTest() throws SQLException {
        OracleConnection connection = dataProvider.getConnection();
        OracleCallableStatement statement = oracleCallableStatement;
        assertFalse(connection.isClosed());
        dataProvider.closeConnection(statement, connection);
        Mockito.verify(connection, Mockito.atLeast(1)).close(); //pass
        Mockito.verify(statement, Mockito.atLeast(1)).close();  //pass

        assertTrue(connection.isClosed()); // expected: <true> but was: <false>

    }

}
公共类DataProviderTest{
@注射模拟
数据提供者数据提供者;
@嘲弄
OracleConnection OracleConnection;
@嘲弄
数据库元数据数据库元数据;
@嘲弄
池数据源;
@嘲弄
OracleCallableStatement或OracleCallableStatement;
@之前
public void setUp()引发SQLException{
initMocks(this);
ReflectionTestUtils.setField(数据提供程序,“ParseSqlErrorFunction”,“一些SQL错误函数”);
Mockito.when(dataSource.getConnection()).thenReturn(oracleConnection);
Mockito.when(oracleConnection.getMetaData()).thenReturn(databaseMetadata);
Mockito.when(oracleConnection.prepareCall(Mockito.anyString())。然后返回(oracleCallableStatement);
}
@试验
public void closeConnectionTest()引发SQLException{
OracleConnection=dataProvider.getConnection();
OracleCallableStatement=OracleCallableStatement;
assertFalse(connection.isClosed());
dataProvider.closeConnection(语句,连接);
Mockito.verify(连接,Mockito.atLeast(1)).close();//传递
Mockito.verify(语句,Mockito.atLeast(1)).close();//传递
assertTrue(connection.isClosed());//应为:但为:
}
}

测试中的连接是模拟对象,因此运行close方法实际上不会将isClosed的值从false更改为true。

您可以删除最后一个assert,因为它是一个mock,您只需验证close方法是否在连接上执行,您不需要验证它所做的事情。

您可能想考虑切换使用资源,而不是使用像您的代码一样的方法。在Java7中引入try with resources后,这些拐杖基本上已经过时,不再需要了。@MarkRotteveel如果可以的话,我会:)
public class DataProviderTest {

    @InjectMocks
    DataProvider dataProvider;

    @Mock
    OracleConnection oracleConnection;

    @Mock
    DatabaseMetaData databaseMetadata;

    @Mock
    PoolDataSource dataSource;

    @Mock
    OracleCallableStatement oracleCallableStatement;

    @BeforeEach
    public void setUp() throws SQLException {
        MockitoAnnotations.initMocks(this);
        ReflectionTestUtils.setField(dataProvider, "parseSQLErrorFuntion", "Some SQL error function");
        Mockito.when(dataSource.getConnection()).thenReturn(oracleConnection);
        Mockito.when(oracleConnection.getMetaData()).thenReturn(databaseMetadata);
        Mockito.when(oracleConnection.prepareCall(Mockito.anyString())).thenReturn(oracleCallableStatement);
    }

    @Test
    public void closeConnectionTest() throws SQLException {
        OracleConnection connection = dataProvider.getConnection();
        OracleCallableStatement statement = oracleCallableStatement;
        assertFalse(connection.isClosed());
        dataProvider.closeConnection(statement, connection);
        Mockito.verify(connection, Mockito.atLeast(1)).close(); //pass
        Mockito.verify(statement, Mockito.atLeast(1)).close();  //pass

        assertTrue(connection.isClosed()); // expected: <true> but was: <false>

    }

}