【发布时间】:2020-09-25 09:22:15
【问题描述】:
你能帮我理解这段代码吗?
我正在尝试验证数据库连接是否已关闭。 即使 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>
}
}
【问题讨论】:
-
您可能需要考虑切换到 try-with-resources,而不是使用像
closeConnection和JdbcUtils.closeStatement/closeConnection这样的方法;随着 Java 7 中引入 try-with-resources,这些拐杖在很大程度上已经过时和不必要了。 -
@MarkRotteveel 如果可以的话我会的:)
标签: java spring jdbc junit mockito