即使调用已验证,连接也不会关闭
Connection not closed even if call is verified
你能帮我理解这段代码吗?
我正在尝试验证数据库连接是否已关闭。
即使 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>
}
}
您测试中的连接是模拟对象,因此 运行 close 方法实际上不会将 isClosed 的值从 false 更改为 true。
您可以删除最后一个断言,因为它是一个模拟,您需要验证的只是连接上执行了关闭方法,您不需要验证它做了什么。
你能帮我理解这段代码吗?
我正在尝试验证数据库连接是否已关闭。 即使 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>
}
}
您测试中的连接是模拟对象,因此 运行 close 方法实际上不会将 isClosed 的值从 false 更改为 true。
您可以删除最后一个断言,因为它是一个模拟,您需要验证的只是连接上执行了关闭方法,您不需要验证它做了什么。