首页 > 解决方案 > 即使验证呼叫,连接也不会关闭

问题描述

你能帮我理解这段代码吗?

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

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

public static void closeConnection(CallableStatement cs, Connection conn) {
    JdbcUtils.closeStatement(cs);
    JdbcUtils.closeConnection(conn);
}

并测试:

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>

    }

}

标签: javaspringjdbcjunitmockito

解决方案


测试中的连接是一个模拟对象,因此运行 close 方法实际上不会将 isClosed 的值从 false 更改为 true。
您可以删除最后一个断言,因为它是一个模拟,您只需要验证关闭方法是否已在连接上执行,您无需验证它做了什么。


推荐阅读